Allows consumers to signal the drain goroutine to stop by closing
the underlying channel. Used by CLI dispatch watch cleanup.
Co-Authored-By: Charon <charon@lethean.io>
EventEmitter interface with ChannelEmitter (buffered, non-blocking) and
MultiEmitter (fan-out). Wired into Dispatcher (5 event types) and
AllowanceService (3 event types). 20 new tests, all passing under -race.
Co-Authored-By: Charon <charon@lethean.io>