General-purpose timeout proxy for providing timeouts on all methods on the
underlying object. Currently just used for APIOperations, but could wrap any
object. NOTE: this is not used for search because search needs timeout on an
element by element basis. Moreover, it would be unsafe for search since the
thread could continue to return elements after it has timed out and we need
to guarantee that not happen.