109.27.00

- Added new hashtable module, `Pooled_hashtbl`.

  `Pooled_hashtbl` is a drop-in replacement for `Core_hashtbl`, and
  has the same interface.

  `Pooled_hashtbl` is a linked-chain hashtbl implemented using the
  pooling features of `Zero`.  In addition to pooling, by using
  `Flat_tuple_array` (and therefore `Obj_array`) it has much improved
  performance when working with immediate keys or values, as a test is
  performed and the `caml_modify` skipped when possible.

  The algorithm is a straightforward implementation, and as such will
  not perform well under heavy collisions that come from poor hash
  functions.  Additionally, since the pool of Key/Data nodes are
  created up front, rapidly creating and releasing `Pooled_hashtbl`s
  will not perform well.

  For a well-thought-out hash with a long-lived table and immediate
  values as keys (or data), `Pooled_hashtbl` will very likely
  outperform `Core_hashtbl`.
- Made pointers in `Pool.Obj_array` contain the unique id of the
  object they point to.

  This allows one to check in constant time check whether a pointer is
  valid.
- Improved the performance of `Timing_wheel` by internally exposing
  `Priority_queue.Elt_.t ` private int`.

  This allows the compiler to eliminate some `caml_modify`'s.  This
  made `nanoseconds_per_step` in the timing-wheel benchmark go from
  96ns to 79ns.
- Changed `Timing_wheel` to cache its minimum element.

  This is an important optimization for how async uses `Timing_wheel`.