Faster handling of many outstanding timers
Faster handling of many outstanding timers

AbstractEventHub.remove_timer now runs in O(1) time instead of O(N).
Additionally, a Python-level __cmp__ function that was called for every
outstanding Timer has been removed/avoided.

This is significant when you have many Loops blocked on something like:

    while True:
        evt, result = first(waits=[some_event], sleep=a_long_timeout)
        if evt == "sleep":
            break
        handle(result)

In the common case, some_event will trigger and the sleep is cancelled.
When you have many Loops running that code, and some_event firing many
times per second, remove_timer gets called quite a lot.

This change allows diesel to better scale to thousands of relatively
active Loops that use the above pattern.

dieseldev/diesel