Async_kernel.IvarSourceA write-once cell that can be empty or full (i.e., hold a single value).
One can read an ivar to obtain a deferred that becomes determined when the ivar is filled. An ivar is similar to an 'a option ref, except it is an error to fill an already full ivar.
fill t v fills t with value v if t was empty. If t was full, fill raises an exception. It is guaranteed that immediately after calling fill t, is_some (Deferred.peek (read t)).
fill_if_empty t v fills t with v if t is currently empty. If t is full, then fill_if_empty does nothing.
read t returns a deferred that becomes enabled with value v after the ivar is filled with v.
value_exn t returns v if t is full with value v, and raises otherwise.