I'll answer my own question, or at least the first of my questions. I didn't realize that the Polygon() / generate_mesh combination automatically adds vertices at the vertices of the polygon. So I can generate a mesh with the same boundary points by feeding these points to Polygon(). This seems kind of sketchy, but it works...
# Build a mesh
def AddVerticalBoundaryVertices(l,x,y,n,dr):
for i in range(1,n):
if dr == -1: # Values go from (near) y to 0 with n points
val = y * float(n - i)/float(n)
elif dr == 1: # values go from (near) 0 to y with n points
val = y * float(i)/float(n)
l.append( Point(x, val) )
boundary = [Point(0.0,0.0)]
boundary.append( Point(Lx,0.0) )
AddVerticalBoundaryVertices(boundary,Lx,hy[-1],Ny,1)
for i in range(0,Nx+1):
boundary.append( Point( hx[i] , hy[i] ) )
AddVerticalBoundaryVertices(boundary,0.0,hy[-1],Ny,-1)
boundary.append( Point(0.0,0.0) )