use a priority queue (implemented with a binomial heap) to handle timeouts

no more use of timerfd in the epoll implementation, now all the implementations
(select/epoll/kqueue) share the same logic to handle timers