The two kinds are matched by the same trie and verified by the same obligation, and the only
thing that separates them is what the replacement is written in. Keeping them one language
rather than two is the whole reason spec/09-optimizer.md section 9.3 and
spec/10-backend.md section 10.2 ask for a rule DSL at all, because a rewrite and a
lowering are the same claim about two terms and there is no reason to say it twice.
IR to IR. The replacement is IR, so a rewrite can be applied over and over and the
result is still something later rules match. spec/optimizer/13-rewrite-rules.md.
IR to machine. The replacement is a machine term, so a lowering is the last thing that
happens to a value and nothing matches what it produces. spec/10-backend.md.