Check for exception before re-throw, fix comments.

Recursion check originates here and is unnecessary now:
http://efesx.com/2010/03/21/catching-uncaught-exceptions-within-terminate/

Also call std::abort() instead of abort().
Use print_stacktrace() instead of inline code

The `print_stacktrace()` function defined in `core/util/stacktrace.h`
essentially does the same thing and also does the platform-specific stuff. It
should be used in a few other places in this file as well.

This still prints stacktrace twice in OT_FAIL* and OT_ASSERT* macros (and three
times if we enable signal handlers).

The `print_stacktrace()` call from OTLog::logAssert could be skipped if we know
for sure that `ot_terminate()` is our handler for `std::terminate()`. Maybe
introduce a flag `OT_ASSERT_PRINT_STACKTRACE` to control that.