Improved BufferPool behavior:
- caching buffers via weak references
- ResizeAndFlushLeft can re-use already existing buffers
- GetBuffer can return the smallest fitting buffer for a specific size
- ResizeAndFlushLeft can handle OutOfMemoryException