A sync object used to wait for tasks. It is an external sync object, meaning it can
only be read from outside tasks. If you need to await a task whose result was passed into
another task, or you need to share a task “handle” without sharing the result, you should
use a Fence.
A sync object used to add control flow to tasks. It is an internal sync object, meaning it can
only be read from within a task. If a task depends on another one to finish, you should use a
Semaphore to force the task to wait for the dependency to finish.