Given a function fun which returns a promise,
globally memoize it (across all threads),
so that at most one invocation of fun with the given parameters
is invoked during the program's lifetime.
If a fun promise is in progress (incl. if started
by another thread), wait for it to finish first.
Given a function fun which returns a promise, globally memoize it (across all threads), so that at most one invocation of fun with the given parameters is invoked during the program's lifetime. If a fun promise is in progress (incl. if started by another thread), wait for it to finish first.