If a function posted via EventLoop::post() threw an exception, the event loop would exit without resetting m_post_fn or notifying the condition variable, permanently deadlocking the calling thread in post().
This change catches the exception instead, logs it, and keeps the event loop running so the caller is unblocked and other I/O events continue to be processed.
Fix #259