I'm okay with either; the basic idea is we know the objects being added are `Socket`s, so we can just assume they have `handle_read` and `handle_write` methods:

```
class Socket
  def handle_read(self, ...): 
  def handle_write(self, ...): 
```

Or, if you prefer, you can call it `on_send` and `on_recv`.  I don't have a preference.  There shouldn't be 2 different mechanisms for reading and writing -- i.e. get rid of `callback`.  If I want to schedule a write, I should do it by calling:

`poller.register(self, READ | WRITE)`

When I'm done writing I can call:

`poller.register(self, READ)`

This is mostly how the old loop worked.