Implement a mode in which the rewriter prints differences between adjacent program states rather than the whole states. The whole state is still printed for nodes with multiple predecessors (because merge diffs were annoying to implement and it's still nice to have the full state occasionally) and for leaf nodes (because they're the important ones).
The diffs are computed "semantically" as opposed to plain text diffs. I.e., the diff algorithm is hand-crafted separately for every state trait, taking the underlying data structures into account. This is especially nice for Environment because textual diffs would have been terrible. This, of course, produces quite some boilerplate, but i think it's isolated enough to not bother me that much.