Checkpointer
Persists the checkpoints of each thread so a run can pause and resume later, even in a different process.
A checkpointer has to keep the latest checkpoint of a thread. One that also keeps the earlier ones implements history, and CompiledGraph.history and CompiledGraph.fork can then go back to an earlier step. The checkpointers of this library do; withCheckpoint has the rule for a checkpointer of your own.