DMPlex: Enabling higher-order function spaces

FunctionSpaces now hold a Plex-generated PetscSection that
describes the global node numbering (topology->DoF mapping).
From this we generate a Fenics-style local numbering for each cell
closure, which allows us to populate the cell_node_list.
DMPlex: Marking all points in the Plex according to PyOP2 entity classes.
DMPlex: Reorder sections to create PyOP2-compatible DM/SF.

Reordering the default global and local section created from the
plex is required to sort DoFs into contiguous PyOP2 entity classes:
core, owned, exec-halo. The DefaultSF defining the halo-exchange
can then be derived from these, allowing the DM to perform the halo
exchange.
DMPlex: Creating Halo objects from DMPlex

We derive the receives from the associated PetscSF and the sends are
derived by gathering rank numbers via the PetscSF. The global_to_universal
numbering map is derived directly from the local and global sections
associated with the FunctionSpace.
DMPlex: Adding support for internal and external facets.

Internal and external facets are marked on the sequential Plex
using DMLabels, from which the auxiliary _Facets object can be
derived. When doing this a permutation needs to be applied to all
cell cones to align DMPlex's local facet numbering with Firedrake.
DMPlex: Adding support for boundary IDs.

Boundary IDs are applied via the Plex label "boundary_ids" and
mimic the previous gmsh-based unit mesh setups.
DMPlex: Switching most remaining unit meshes to use DMPlex.

Build DMPlex objects from coordinate and cell-to-node mapping for
unit triangle, tetrahedron and interval. Only UnitCircle still requires
Gmsh meshing, but _from_file() now uses DMPlex's Gmsh interface.
DMPlex: Creating IcosahedralSphereMesh from DMPlex

This requires proper dimension handling, where topological and
geometric dim can be different.
DMPlex: Adding plex-based extrusion

For extruded function spaces we use sections that point to stacked
vertical dof columns for each point in the base plex. When building
element->dof mappings we then traverse the closure explicitly and add
the DoFs belonging to the first element in the stack according to
explicit extrusion numbering rules.
DMPlex: Relaxing several convergence tolerances