SocketManager: use a timer wheel

Reviewer: @poolakiran

The maximum number of timers we need to support recently increased by an order
of magnitude, and the datastructures SocketManager was using were not efficient
at this scale. This change replaces the flat array with a timer wheel.

This increased performance in my barrier microbenchmark by 61%.

There's still room to speed up SocketManager, but it may require API changes which I avoided in this pull request. It's still consuming about 10% CPU time during benchmarks.