Implement refactored Unix managed exception handling
This change refactors managed exception handling so that we perform full first
pass over both managed and native frames and only after we find target frame,
we perform the second pass.
This helps in debugging of unhandled managed exceptions since the debugger can
kick in at the end of the first pass when the stack frames are still intact and
it can show the context where the exception was fired.
Commit migrated from https://github.com/dotnet/coreclr/commit/
a723811c171a3dae340a08f24afedbfc238b7930