Rework sparsity construction

Unify sparsity construction for the MPI and non-MPI cases.
Additionally, simplify the extruded sparsity construction code to reduce
repetition.  As an additional bonus, we now correctly build sparsity
patterns for all extruded cases in parallel as well as serial.

Performance is unchanged from the previous code, with some marginal
improvements in parallel extruded VFS cases (but it's basically a
wash).
Cythonizing the sparsity extension requires petsc4py include path