for better readability, as we don't need to care about the details of
the executor. and the returned futures are blocked in their dtor as
> these actions will not block for the shared state to become ready,
> except that it may block if all of the following are true: the
> shared state was created by a call to std::async, the shared state
> is not yet ready, and this was the last reference to the shared state.