Add AsyncObjectPool.use to combine take and giveBack

This seems like a common use case, and as long as the provided function doesn't hold onto the provided item it should be safe.  Is this reasonable?  Is it sufficiently non-trivial for addition?  It eliminates duplicate code in ConnectionPool.

I'm working up to writing a withTransaction-like function but want to make sure I'm on the right track.