Compiler must clear $! for early return from method-level rescue.

A method-level rescue was optimized in recent months to not
completely deoptimize and create a separate child method with full
scoping. However, in the process of optimizing that, we returned
to using normal flow control rather than exception-based flow
control. This caused a literal return inside such a rescue to not
clear $! as it should, since it immediately escaped the method
rather than passing through finally logic.

I modified rescue logic to always use exception-based return (and
friends) in order to ensure that the finally logic triggered. This
is not the ideal way to fix the bug, but it's good enough for now.