Remove restriction that Dats must have data associated with them

par_loops are collective and therefore if one iterates over the
boundary ids in a mesh, some of the processes may have Dats with no
data associated with them.  So only raise an error if the size of the
Dat is zero when the Dat's dataset size is non-zero.
Rename dirty slot on Dat to needs_halo_update

The latter more accurately describes what it actually is.
Fix bug in MPI Global reductions

Since we execute a bit of the par_loop (the exec-halo) after kicking
off the reduction across a Global, we must reduce into a temporary
buffer and the copy back after the par_loop has finished completely.
Otherwise our result will be overwritten by whatever happens in the
exec-halo.
Use ._data not .data to pass data pointer to C function

By using the former, we avoid unnecessarily marking a Dat as needing a
halo update.
Move MPI implementation from base to runtime_base

It doesn't make sense to have base implement halo swapping and so
forth, since this requires a runtime, so move the code around
appropriately.
Add more documentation to Halo object
Another FIXME comment