The trace's logic is now plain, tested code: trace.ts pairs each step's
start with its outcome, groups steps by delivery attempt, names and
describes them, and holds the trace's states as a reducer; stream.ts runs
the token and the event stream. The page only draws them, unchanged.
Two fixes on the way: "Started Ns ago" counts from the trace's own start
(it carried on from the previous trace before), and cancelling while the
token is still on its way no longer opens the stream afterwards.