Mat zeros

Fill newly created matrices with zeros, so petsc doesn't compact the space.

Additionally, rework sparsity construction to remove code duplication and implement parallel sparsity construction for all extruded cases.

AFAICT, this doesn't change the speed of sparsity building.
If the block is not square, petsc in fact goes away and does the "loads" of function calls for us, because they have not optimised for non-square blocks.  For square blocks, we go from NxN calls to 1 call, and, more importantly, only have 1 lookup to find the entry in the matrix (rather than NxN).  I hope all of this shuffling happens (at worst) in L1 cache, so I don't expect it to be very expensive).

In addition to the insertion savings for the square-block case, petsc also /does/ optimise a number of routines (like matrix multiplication) for block-sparse systems, so we'd expect to see wins there too.