The current assumption -- emit will only return once all signal
handlers are done -- is false when cross-thread signals
happen. Therefore we can't assume the stack-allocated event is alive
long enough to just pass pointers. We're copying that object now which
should be pretty small and don't get any memory leaks or lifeness
problems.