Add a new Poller implementation that uses epoll rather than select

This should scale to a large number of FDs. I still need to do some benchmarking.