Manage worker threads with an easy to use abstraction. We can expand this to support thread deletion in the future.
This abstraction allows executing blocking functions (like recvfrom on a socket configured for blocking) without blocking the service thread. It is intended to be used with SleepClientThread.