Add halo exchange functions on MixedDat

Previously we deferred to the superclass functions, which don't do the
right thing.
Create correct sparsity pattern for non-square blocks
Fix Mat row zeroing for parallel execution

We use row zeroing to apply strong boundary conditions which consists of
placing a 1 on the diagonal corresponding to bc nodes.  We've already
arranged that the off-diagonal entries are zero and just need to fix up
the diagonal.  We can't use PETSc's row zeroing functionality because we
want to zero locally indexed rows (without applying a mapping to the
global values).  Instead, build a Vec that is zero everywhere except on
bc nodes (where it's 1) and use that to set the diagonal in the
Mat (using ADD_VALUES).
Compute correct ISes for parallel mixed vecscatter

We need to build global offsets, not just local ones.