Isolate cleanup phase from interrupts

When implementing the initial interrupt handling code, we overlooked the
fact that the cleanup phase is not atomic, and hence prone to be
interrupted.

Furthermore, we're changing the behavior to only cleanup the context if
no unexpected exceptions occurred (i.e. we removed the `ensure` block).
It seems like we shouldn't be trying to clean up if a serious problem
occurred earlier, as that could violate our assumptions about whether
the environment is in a state that _can_ be cleaned up.

Change-Id: I33ed2afcafab8d93fc45f43f45f6255e6407fd7a
Reviewed-on: http://gerrit.causes.com/41193
Tested-by: jenkins <jenkins@causes.com>
Reviewed-by: Shane da Silva <shane.dasilva@brigade.com>