Add function to fully fill a PETSc matrix with zeros

After preallocating the correct amount of space, we fill the entire
matrix with zeros so that on first assembly PETSc does not compact out
some of the space we said we'd need.
Fully fill matrices with zeros on construction

The sparsity pattern we specify is the right one, but PETSc compresses
the allocation on matrix assembly to the number of "used" nonzeros.
This can result in requiring reallocation if (for example) the values
change because we're actually assembling the linearisation of a
non-linear operator.  To avoid this, when we first build a matrix, fill
all the entries we might ever use with zeros.
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).