Internalised read and write buffers

Previously the caller provided a []byte for reading and writing with the
q. Now the q itself manages these buffers and gives access to the client
via ReadBuffer(), WriteBuffer() methods. This allows the q to control
the exact size of the buffers as well as provide cache line padding to
prevent false sharing.