Modify rate-gate to use future instead of a separate thread

This has the following benefits:

Does not require separate Thread creation per function rate-gated,
which can be an issue if you wish to rate-gate lots of functions
independently of one another. Instead, we utilize the thread pool that
futures execute on.

Simplifies RateGate object by eliminating list of exit times and
thread object. Reduces usage of Java objects, preferring Clojure-isms
instead.  Removes unnecessary extra logic associated as well.