Pack sends/receives into buffers before sending

Because we're using asynchronous comms, we can't pass a python object
exposing the buffer interface, because the buffer might have
disappeared by the time we actually receive the data.  This is the
same problem as passing fortran array slices into Isend/Irecv
pairs (although at least we don't segfault).  So pack into temporary
buffers and unpack after actually receiving everything.
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.