Represents the result of a computation that may not have completed yet.
You can use the future in a blocking manner using the wait() function, or
you can use a promise from the future to receive the result when the future
has been resolved.
When the future is dereferenced using wait(), the result of the computation
is cached and returned for subsequent calls to wait(). If the result of the
computation has not yet completed when wait() is called, the call to wait()
will block until the future has completed.