Rewrote and documented with a simpler, more correct approach.

The use of weak references to resolve race conditions was inverted,
and is now the approach for discarding unused transfer queues. The
resource lifecycle events can now be intercepted. The time-to-idle
eviction is properly defined as the time that the resource remains
in the pool without being borrowed. A naive implementation was used,
but can easily be replaced with a more efficient approach if needed.

Only some of the unit tests were written, but many more are required.