By default, a variable is created in Scope.top, on the theory that its value
depends on external stimuli (via Var.set), not on the current scope. However,
in some situations it is useful to supply ~use_current_scope:true to create a
variable that is invalidated when the current scope is invalidated, e.g. if one
wants to use on_update (watch var) ~f:(function Invalidated -> ... | ...) to
remove the external stimulus that was setting var.
It is allowed to do let t = create a during stabilization; for that
stabilization, watch t will have value a.
set t a sets the value of t to a. Outside of stabilization, subsequent
calls to Var.value t will see a, but the set will not have any effect on
incrementals until the next stabilization, at which point watch t will take on
whatever value t was at the start of stabilization, causing incremental
recomputation as usual.
During a stabilization, calling set will behave as if set was called after
stabilization finished: the new value will not be seen (by value v or watch v)
until after the stabilization finishes.
watch t returns an incremental that tracks the value of t. For a given t,
all calls to watch t return the same incremental.
value t returns the value most recently set for t outside of
stabilization.
latest_value t returns the value most recently set for t. It can differ
from value t only during stabilization.