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.