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.