Honestly, I didn't look too closely at what the existing default uncaught exception handler was doing.  I just moved it over from Executor.scala into someplace accessible from the scheduled functions.  That may not be what we want; and even if it is what we want, we need to decide just how accessible UncaughtExceptionHandler needs to be -- almost certainly not fully public like it is now in this PR.

This handling of OOM has been in Executor's default uncaught exception handler for a long time, and probably @mateiz can say what the design intention was.