Do executes and returns the results of the given function, making
sure that only one execution is in-flight for a given key at a
time. If a duplicate comes in, the duplicate caller waits for the
original to complete and receives the same results.
Lock prevents single flights from occurring for the duration
of the provided function. This allows users to clear caches
or preform some operation in between running flights.