is based on top of the patch for ASYNC-198
finallys can either be entered in the normal course of execution or
when handling an exception. so a finally X behaves sort of like
(try (let [r (code)] (X) r) (catch Throwable t (X) (throw t)))
previously the :try code was generating a single finally block which
tried to determine if it needed to rethrow an exception or not by
looking at the value of CURRENT-EXCEPTION, but this didn't work
correctly in certained nested try/catches.
so now the :try code generates two finally blocks, one that rethrows
and one that doesn't. the rethrow block goes on the exception frames
stack, and the not rethrowing block is jumped to at the end up the
body and each exception handler.
the patch also gets rid of CURRENT-EXCEPTION entirely, as it was only used by finally to determine if it needed to throw or not