notifications on request cancellation
add a callback to stop() to allow running the current thread's event loop
option to pass data parameter, and add more explanation
make SourceInfo object noncopyable and use a shared_pointer for it
use asynchronous worker termination

instead of waiting until all threads have joined, we are now supplying a callback that will be invoked once all threads have terminated. you can use this callback to free the worker struct