Beloch.SpinePer-statement hash chain for the incremental evaluation cache.
The chain has exactly one entry per Ast.stmt (the `paper square` header, which the parser consumes without producing a statement, is folded into the chain seed instead of getting its own key). Each entry folds in every entry before it, so the key at index i is a hash of everything up to and including i. Appending a statement leaves all earlier keys unchanged (full prefix reuse); editing statement k changes k and every key after it. See Session.
val span_of_stmt : Ast.stmt -> Error.spanval canon_stmt : string -> Ast.stmt -> stringval chain_keys : string -> Ast.program -> string list