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 integers to Set instantiation to give
these different sizes.  Baby steps towards parallel running.
Add it_space, is_direct and is_indirect properties to base ParLoop
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
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.