Final pass cleans up high-level IR

This is a late-stage optimization. See the vocab compiler.tree.late-optimizations.

This pass runs after propagation, so that it can expand type predicates; these cannot be expanded before propagation since we need to see 'fixnum?' instead of 'tag 0 eq?' and so on, for semantic reasoning.

We also delete empty stack shuffles and copies to facilitate tail call optimization in the code generator.