Changes in main execution and exception handling

- the __main__ module is now imported normally, searched for a main()
function, and that function is run in its' original context. This allows
us to not have to worry about using runpy and having it appear in error
messages.
- ReportFatalError is now installed at interpreter level *before* the
main() function is ever called, so that if there's a syntax error in the
script or a runtime error that makes the program halt, it will be
printed properly before the crash occurs.