Any successful pop() call requires a corresponding push() or discard() call
A pop() call that returns null is considered successful.
@param timeout time to block while waiting for an instance
@param unit unit of time dicated by the timeout
@return an entry from the pool or null indicating permission to create and push() an instance into the pool
@throws InterruptedException vm level thread interruption
@throws IllegalStateException if a permit could not be acquired
@throws java.util.concurrent.TimeoutException if no instance could be obtained within the timeout