* Check through all managed objects and properly refcount them
  using shared_ptr.
* Ensure that we comb through the current code and enforce the distinction
  between user errors and program exceptions.
* Investigate using UMONITOR/UMWAIT for spinlocks to reduce busy-waiting
  stress/power consumption. Look for a parallel on ARM.
* Investigate WFE/SEV to reduce busy-waiting in spinlocks on ARM.
* The input arg `requiredLocks` to LockSet::LockSet() should be
  a ref and not by-value. Propagate this upward into
  SerializedAsyncContin and into all derived classes'
  constructors.
* In classes like udpCommandDemuxer and possibly other such background tasks,
  use a spinlock to ensure that the stop() function doesn't deallocate the
  data to be used by the daemon task while the daemon task is executing.
  * Alternatively we could re-emqueue the message;
  * Alternatively, if select/poll don't consume the read-data-rdy flag,
    we can just return and let the next timer invocation run instead.
  * Alternatively, we can use an xchg'd flag between the udp listener
    and the timed enforcer.
