A global graph of async computations used by tenacious: each node normally corresponds
to a single execution of a memoize: if memoize's heart gets broken, we create a new
node next time it's demanded.
There is an edge from a to b if computation a is waiting for result of
computation b.
module Node : sig ... endmodule Dump : sig ... endval root_until : node:Node.t ‑> 'a Async.Deferred.t ‑> 'a Async.Deferred.tAny created node that blocks no other node should be made a root, otherwise it doesn't participate in the cycle checking and dumping at all.
val edge_until : Node.t ‑> blocked_on:Node.t ‑> 'a Async.Deferred.t ‑> 'a Async.Deferred.t