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.
include Core.Invariant.S1 with type 'a t := 'a tfill_exn t v fills t with value v if t was empty. If t was full, fill_exn raises an exception. It is guaranteed that immediately after calling fill_exn 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.