Rewrite to a lighter weight time-to-idle implementation

The previous approach leveraged the implementation in Guava's Cache.
This added extra overhead due to constantly adding and removing the
resource, resulting in hash table locks and other activities. This
differs from a cache's optimized behavior where writes are rare and
reads are the common case. In an object pool idle time is when the
resource has remained unused, whereas in a cache it is the last
access time when an entry was read.

Direct support of time-to-idle expiration is now through an access
ordered queue guarded by a try-lock. The try-lock avoids blocking
calls and contention by first enqueing the operations to a task
queue, to be run by the victim that acquires the lock for cleanup
purposes. This is similar to the amortization model in CLHM and
Guava's Cache.