Move rewrites to _after_ recursive `step`.
Make coalesce* traverse a bit more.
Remove dead code.
Add a DummyOp.

This lets us pass around an incomplete op as if it’s complete, and then when merged, the Dummy Op is just replaced with the other side of the merge.
Various fixes

• use `DummyOp`
• fix `mergeGroups`