This changes the read path so that we hold the Connection::lock mutex while
reading data off the socket. This ensures that we are reading into a
buffer we are allowed to use, and allows users to revoke a previously
posted buffer. If that happens, switch over to a newly allocated buffer.
Note that currently the final result bufferlist may contain part of the
provided buffer and part of a newly allocated buffer. This is okay as long
as we will always read the same data into the buffer. And in practice, if
the rx buffer is revoked then the message itself will be thrown out anyway.