SourceReader: bad initialization do not crash main thread

This patch adds to the main thread the uncaught exception handlers for all source threads, such that exceptions during file source initialization do not crash the main thread.
For file source, any exception during initialization will stop the source thread and propagate to the main thread, but will be handled gracefully by the callback handler at main thread, which simply loggs the error.  The reason behind this design is that (1) callback handler is a good way to turn the main thread into daemon-like process; (2) we only need to handle the errors that the SourceReader is supposed to handle based on its semantics, e.g. socket source should be reconnectable so the semantics require SourceReader to siliently reconnect when initialization or reading fails; whereas for file source, we do not allow reconnection, so simply propagating the error to main thread and let the main thread deal with it is fine with me.