add a crash handler at initialization

Using `setUncaughtExceptionHandler` will affect child threads too, e.g.:

```haskell
import Control.Concurrent
import GHC.Conc.Sync

main :: IO ()
main = do
    setUncaughtExceptionHandler $ \ex -> print ("uncaught", ex)
    forkIO $ error "child"
    threadDelay 1000000
    error "main"
```

If the goal is to attach an exception handler to the main thread, I think wrapping up the call to `appMain` with a `catch` should be sufficient.