Robustness: logging and clean exit/reboot

Lots of stuff in here (including the RequestListeners/ServerState commit which is also its own PR).
A bunch of logging changes which I needed to debug the other changes. The commits should be well-separated into logical bits despite the large PR.

The general idea of this PR is that we no longer System.exit anywhere, we instead give the xsbti.MainResult back to the launcher, or throw xsbti.FullReload. In order to do this we have to get all our threads to exit and wait for them to finish cleanly.