Properly log caught exceptions + traceback in event, systems

Adds `logger.log_exception()` to allow logging exception with full traceback when errors are caught and ignored.

Note that traceback.format_exception() does not generate a complete stack trace; it only includes the stack entries from the frame that generated the exception until the frame that caught the exception. All other stack entries must be retrieved separately.