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.
This loop is going to be on the order of a few up to maybe 10s of entries for x and y. Presumably we expect the cost for this to be more than offset by having a single PETSc function call instead of loads?