pd.memoize caches the results of an asynchronous function. Pass in an optional
context so the fn is called with the context and pass in an optional hasher so
you can choose how your the arguments of the returned memoized function should
map to results