> In the original version, 0 indicates "fire now", and nil indicates nothing is waiting.

That's an incorrect interpretation of the original [buggy] implementation. "nil" actually meant fire now, an integer meant sleep. In the case where there were no timers, it would call sleep 0. Even sleep 0 is usually guaranteed to cause the task/thread to yield back to the OS scheduler.

See https://github.com/celluloid/timers/blob/master/lib/timers.rb#L43-L47 for details of the original implementation, note that "if 0" is considered true in Ruby.