Add ability to intercept System.exit()

Some students reported JUnit failures due to Nachos code calling
System.exit() after a Machine.halt().

To fix this I force an exception to be thrown when we call Machine.halt() while
tearing down the TestHarness.  This way we never exit directly after
Machine.halt(), but rather only after JUnit decides we are done.

With this solution, we only catch the System.exit() exception during a clean
exit. A better solution would be to update NachosSecurityManager to always
throw an exception on System.exit(), but I'll leave that for another day
because I haven't thought through all the consequences of that.