Cell.DropDrop cells.
A drop cell is a cell on which functions can exchange values:
val make : unit -> 'a tmake () is a new empty drop cell.
val take : 'a t -> 'atake cell blocks until the cell is full with v, empties the cell and continues with v. If there are multiple blocked take and a single put occurs, only the earliest take unblocks.
val put : 'a t -> 'a -> unitput cell v blocks until the cell is empty and fills it with v. If there are multiple blocked put on the same cell and a single take occurs, only the earliest put unblocks.
val is_empty : 'a t -> boolis_empty cell is true if and only if cell is empty.
take' cell is the action for take. An action invocation is enabled when cell is filled with a value v. The invocation synchronizes with v if it manages to empty the cell by taking v.