Add dummy kwargs to void backend constructors
Add dummy Sparsity, Solver and solve in void backend
Add it_space, is_direct and is_indirect properties to ParLoop
Add option to specify split set sizes

When running in parallel, we need to distinguish four different
classes of set elements:

 - CORE (owned and not touching halos)
 - OWNED (the local set size, all the owned elements)
 - EXECUTE HALO (in the halo, but executed over redundantly, to avoid
                 communication)
 - NON EXECUTE HALO (read when executing in the execute halo, but not
                     executed over)

Add the option to pass a list of integers to Set instantiation to give
these different sizes.  Baby steps towards parallel running.
Verify Dat size correctly when instantiating

Now that the Set may have halo elements, the data passed should be of
Set.total_size, not Set.size.
Sketch of halo exchanging
Add Halo object to base
Expose Halo object in public op2 API
Add slot for Halo in Set object
Add halo-exchanging code and reductions using mpi4py

Update sequential ParLoop computation appropriately with split
reductions as well as split halo exchanges.
Add type conversion to numpy arrays for Halo instantiation

Rather than requiring the user to pass numpy arrays for the Halo
sends and receives arguments, allow any numpy arraylike (tuple, list,
etc) so that user code does not look so messy.
Add reasons for assertion failure in Halo instantiation
Move halo verification to Set instantiation time

Rather than verifying the halo send/receive bounds every time we kick
off halo exchanges, just do so when we attach a Halo to a Set.
Create correctly sized PETSc vectors

When running in parallel, the vector is not the length of the entire
Dat.data array.
Tag halo exchanges with the id of the Dat

Do this by saving the Dat._globalcount in an id slot.
Matrix assembly also needs to iterate over the exec halo
Assemble matrix in python

Now that we have a petsc4py matrix handle we can just call
mat.assemble in python rather than generating C code to do so.
Use our own MPI_COMM everywhere

We default to MPI_COMM_WORLD, if we see a halo we check to see if this
is the first one we've seen.  If so, use the communicator we got there
and subsequently check that all halos are defined on the same
communicator.

This may be wrong if halos actually live on a different communicator
than the one we want.  PETSc objects probably still don't live in the
right place.
Expose global (per process) to PETSc (universal) numbering in Halo
Modify PETSc matrix creation to use MatSetValuesLocal

Rather than mapping from global to universal numbers by hand when
inserting into the matrix, just tell PETSc what the mapping is (the
identity if running in serial) and let it figure out the rest.