I'm not sure that this is quite the API that we want to expose. In theory it should be possible to add native bindings for other event loop implementations, and this may be a bit of an unwieldy interface to implement for other loops.

Additionally, having a callback to invoke is a very tricky thing indeed. The stack that the callback is invoked on is not a normal task stack, but rather the scheduler's stack. It's pretty much required for the callback to just signal something else and then return for the scheduler to make progress. Allowing arbitrary code to run may run into complications (I don't think that the stack bounds are in effect for scheduler tasks).

What would you think of changing these to an interface like:

```rust
trait Event Loop {
  fn signal(&mut self, signal: Signum, channel: SharedChan<Signum>) -> Result<...>
}

trait RtioSignal {}
```

Right now none of the other interfaces expose a "close"-style function, although arguably they should... The `RtioSignal` trait could have a `stop` function, but I don't think it matters one way or another that much. With this api it's clear that signals *must* be received over a port, and it's also clear that you create a handler for a signal specifically. Beforehand it was possible to create a signal handler for SIGINT, and then silently transfer it to being a SIGTERM handler (or something like that).