Add uid initialiser to Dat objects

We tag the halo exchange of a Dat with its id slot.  Previously we
would just use the Dat._globalcount to get a unique value.  However,
this assumes that every process declares the same number of Dats in
the same order.  This does not always happen.  To fix this, allow the
user to specify the id explicitly.
Mark Dat as dirty when accessing via RW .data property
Use RW .data access on solution vector when solving

This way, we know to do halo exchanges next time round.
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.  Don't raise an error when trying to access
the data associated with such a Dat.