core: remove pulse semaphore as we now use pulse worker threads.
pulse_worker: unlock mutex before notifying the thread.

This reduces mutex contention.
core, pulse_worker: pulse_worker now destroys via its private flag, not Core::is_destroying().

Usage of the global flag for destructing worker threads was a leaky abstraction
because these threads need to be explicitly notified about the flag change via a
condvar.

Now the pulse_worker::join() will do it all -- set the flag, kick the worker and
wait for it to exit.
source: have a per-source pulse_worker to handle non-specific-channel pulse requests.

If a pulse is sent via pulse() to all channels of the source, use our own multi-
channel worker to process this pulse to have all channels edge at the same time
(this reduces contention on Core::operation_mutex_ and reduces amount of data
sent to sinks).