Add keyed object pools

KeyedObjectFactory is a general interface to obtain class instance for given key.

KeyedObjectPool is a simple implementation.
KeyedObjectPool provides mapping between key and value.
KeyedObjectPool guarantees that the same instance is always return for the same key.

SoftKeyedObjectPool can return different instances for the same key.
SoftKeyedObjectPool allowes instances to be garbage collected.
Only one instance for given key can be referenced at any point of time.
Add caching implementation of byte buffer pool

CachingByteBufferPool reuses buffers until they are garbage collected.