This is a simple ByteBufferPool which just creates ByteBuffers as needed.
It also caches ByteBuffers after they're released. It will always return
the smallest cached buffer with at least the capacity you request.
We don't try to do anything clever here like try to limit the maximum cache
size.