109.36.00

- Made `Hashtbl.Poly.hash` equal `Caml.Hashtbl.hash`, and changed changed `String.hash` and `Float.hash` to match OCaml's hash function.

  Previously, `Core.Poly.hash` had been defined as:

  ```ocaml
  let hash x = hash_param 10 100 x
  ```

  This fell out of sync with OCaml's hash function, and was providing worse hash values.

- Fixed `Obj_array.singleton` to never create a float array.

  Also made it clearer that `Obj_array.copy` could never create a float
  array.

- Changed `Pool.create` to allow zero-length pools.

  Previously, `Pool.create ~capacity:0` had raised, which made it easy
  to write code that blows up on edge cases for no apparent reason.  For
  example, `Heap.copy` was written in a way that copying an empty heap
  would blow up (regardless of its capacity), and `Heap.of_array` would
  also blow up on an empty array.

- Added `String.split_lines`.

  ```ocaml
  (** [split_lines t] returns the list of lines that comprise [t].  The lines do
      not include the trailing ["\n"] or ["\r\n"]. *)
  val split_lines : t -> t list
  ```