* 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.