109.47.00

- Added `Error.to_info` and `of_info`.
- Significantly sped up `Float.iround_*` functions.

  For `iround_down_exn`, the new version appears to use about 25% of the
  CPU time of the old version on non-negative floats.  For negative
  floats it uses around 60% of the CPU time.

  ```
  ┌─────────────────────────┬───────────┬──────────┐
  │ Name                    │ Time (ns) │ % of max │
  ├─────────────────────────┼───────────┼──────────┤
  │ old iround_down_exn pos │     15.02 │    95.23 │
  │ new iround_down_exn pos │      3.75 │    23.75 │
  │ old iround_down_exn neg │     15.78 │   100.00 │
  │ new iround_down_exn neg │      9.80 │    62.10 │
  └─────────────────────────┴───────────┴──────────┘
  ```
- Added `Binary_searchable.Make` functor to core, and used it in `Array` and `Dequeue`.
- Fixed `Bounded_int_table` to match `Invariant.S2`.
- Added to `Pool` support for `10-`, `11-`, and `12-` tuples.
- Added functions to the `Gc` module to get usage information without allocating.

  Added these functions, all of type `unit -> int`:

  ```
  minor_collections
  major_collections
  heap_words
  heap_chunks
  compactions
  top_heap_words
  ```

  They all satisfy:

  ```ocaml
  Gc.f () = (Gc.quick_stat ()).Gc.Stat.f
  ```

  They all avoid the allocation of the stat record, so one can monitor
  the garbage collector without perturbing it.