Run ExpiringHash GC asynchronously
This helps avoid blocking other operations accessing the hash, such as registering agents and reverse tunnels. The later one is especially latency sensitive so this MR should help avoid latency spikes due to GC as Redis I/O is now done asynchronously.
Relates to #165 (closed).