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.