gdb: implement __bool__ which is required by python3
core: introduce bitset iterators

They allow for concise iteration over indexes of set bits:

for (int index : get_set_range(my_bitset)) {
    ...
}
core: introduce efficient timer_set data structure

The data structure optimizes for timer non-delivery by deferring
sorting cost until expiry time. The optimization is based on the
observation that in many workloads timers are cancelled or rescheduled
before they expire. That's especially the case for TCP timers.

The algorithm was originally proposed by Avi. The idea is that we
spread timers into buckets based on the length of the common
bit-prefix between timer's expiry time point (aka timeout) and the
last expiry time point (_last). A timer whose timeout is >= _last and
has no more than N trailing bits the same as _last lands in bucket
N. When we expire at time point _now we calculate the prefix index
between _now and _last (E). We don't need to consider buckets in
indexes lower than E, they don't fire yet and their index won't
change. Timers in buckets with indexes higher than E are known to have
just expired. Finally, we need to walk through all timers inside
bucket E and check if they have expired or not. If timer from bucket E
is not expired we need to re-hash it using the new _last time point.
tests: add test for timer_set
core: switch async timers to use timer_set
core: make sched::timer_list use timer_set
core: avoid unnecessary reschedules
core: use unordered_queue_mpsc for released_timer_tasks

The unordered_queue_mpsc burns a bit less cycles than queue_mpsc and
will suffice in this case.