DMPlex: Generating UnitSquare/CubeMesh from DMPlex object

All information required to build the function space is now derived from
the DMPlex object stored with the firedrake mesh. This currently works
only in serial with non-extruded meshes and it also changes the internal
facet numbering, but the UnitSquare/CubeMesh is now generated on-the-fly
and does not rely on the Fluidity interface anymore.
DMPlex: Generating cell->DoF mapping from DMPlex

This change enables higher order function spaces. It creates a
PetscSection describing the DMPlex->DoF mapping from the FIAT element. It
also adds a Vec of DoF indices to the mesh object that can be used with
the DMPlex and the dof_mapping to generate the DoFs of a DMPlex closure.
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 only
add the dofs belonging to the first element in the stack.