Cleanup of OOM notification bugs. #4774

This bugfix clears up several issues:
- When the OOM killer is enabled, there were a few race conditions between
  the job shutdown and the OOM notification.  It was possible to recieve
  the notification *after* the VanillaProc object was deleted (Close_Pipe
  wasn't called from the destructor).  RAL observed this causing Close_Pipe
  being called on an invalid pipe (0); since it was a use-after-free, a
  SIGSEGV was also possible (but never observed).  Similarly, when the
  JobReaper is called, we should check to see if a OOM notification also
  occurred and put the job on hold immediately.
- Improve the error message when EINVAL is received when disabling the
  OOM killer - the kernel doesn't allow the OOM killer to be disabled
  when the cgroup is a child in the hierarchy.
- Added a virtual destructor for VanillaProc.
Version history for #4774.