clocks 0.0.1

A testable source of time
Documentation
# Can sleep ever work?

Let's consider the first case, where sleep does not interlock with
advance. In this case, we never know where the other clocks are, which
means it's totally unpredictable what happens when we advance the
timer, unless we really wait some amount of time (how much) to
guarantee they have reached a barrier. It basically requires a
separate barrier so that we know we're stepping the right things.

If we integrate the barrier, we concluded this always led to
deadlock. Why did we conclude that? Our actual real tests immediately
did deadlock when we did this, which is a clue. We're effectively
constructing an n-way barrier where everything must be sleeping.  But
what if everything isn't sleeping, what if it's blocked on other
things. In the limit, what if it's blocked on us? What if it doesn't
sleep; if it doesn't sleep then we can't advance.

So, really, we should make the barrier optional. What does that
actually look like? We need to identify a time at the barrier that
everyone begins their sleep, that way they have a predictable wake
time. Then we need the advance to happen.

Going back, the reason fake clocks work well is that the passage of
time within code can generally be considered negligible. As soon as
the code itself measures the passage of time, e.g. via `sleep`, we end
up in knots. We all want to transition together to the next
moment. The old API captured this idea very well. The problem we ran
into is: what if we block on something other than sleep?  What if
we're blocked on observing data somewhere? If that happens then we
can't advance the clock and it all just deadlocks (if we're trying to
advance and then upload the data for example).

The sleep API is not a good one to screw with if we do this, because
the application code should be relatively oblivious. So again, an
`advance_rendezvous` type call matches. But then how does this work?
I guess `advance_rendezvous`