Deliver to UI

Adds a method to deliver a signal's events to the main thread, doing so immediately if possible (as discussed in #1402). I don't attempt to drain multiple events immediately. Any further events created recursively or concurrently are enqueued to be delivered later.
I think this conditional and dispatching could be factored out into a local `schedule` block or something like that, since the basics of it are reused across every event type.