module type Pool = sig .. end
module type S = Pool_intf.S
include Pool_intf.Pool.S
This uses an Obj_array.t to implement the pool.  We expose that Pointer.t is an
      int so that OCaml can avoid the write barrier, due to knowing that Pointer.t
      isn't an OCaml pointer.
module Unsafe: sig .. end
An Unsafe pool is like an ordinary pool, except that the create function does
      not require an initial element.
module Debug: functor (Pool : S) -> sig .. end
Debug builds a pool in which every function can run invariant on its pool
      argument(s) and/or print a debug message to stderr, as determined by
      !check_invariant and !show_messages, which are initially both true.
module Error_check: 
Error_check builds a pool that has additional error checking for pointers, in
      particular to detect using a freed pointer or multiply freeing a pointer.