lowering: Keep track of which :enter correspond to which :leave
This should be NFC and is intended to allow the optimizer to
delete :enter statements (by replacing them with `nothing`),
without leaving dangling `:leave`s around. This is accomplished
by having `leave` take (a variable number of) `:enter` tokens
(that are already being used by `:pop_exception`). The semantics
are that a literal `nothing` or an SSAValue pointing to a `nothing`
statement are ignored, and one exception handler is popped for
each remaining argument. The actual value of the token is ignored,
except that the verifier asserts that it belongs to an `:enter`.
Note that we don't need to do the same for :pop_exception, because
the token generated by an `:enter` is semantically only in scope
for :pop_exception during its catch block. If we determine the
`:enter` is dead, then its catch block is guaranteed to not be
executed and will be deleted wholesale by cfg liveness.
I was considering doing something fancier where :leave is changed
back to taking an integer after optimization, but the case where
the IR size is bigger after this change (when we are `:leave`ing
many handlers) is fairly rare and likely not worth the additional
complexity or time cost to do anything special. If it does show
up in size benchmarks, I'd rather give `:leave` a special, compact
encoding.