109.22

- Added new module `Validate`

  Added bounds validation to `Comparable`, so that all comparable modules
  automatically get:

  ```ocaml
  val validate_lbound: min : t bound                  -> t Validate.check
  val validate_ubound:                  max : t bound -> t Validate.check
  val validate_bound : min : t bound -> max : t bound -> t Validate.check
  ```

  One can also call `Comparable.With_zero` to get:

  ```ocaml
  val validate_positive     : t Validate.check
  val validate_non_negative : t Validate.check
  val validate_negative     : t Validate.check
  val validate_non_positive : t Validate.check
  val is_positive     : t -> bool
  val is_non_negative : t -> bool
  val is_negative     : t -> bool
  val is_non_positive : t -> bool
  ```

  By convention, we are going to name `Validate.check` functions that are added to a module
  by prefixing the name with `validate_`.  We considered making a `Validate` submodule, but
  that would be too hard to deal with because of restrictions in OCaml that make it hard to
  extend and compose submodules.

- Improved `Lock_file.Nfs` to clean up after itself if a program is restarted on the same machine.
- Added function `Signal.can_send_to : Pid.t -> bool`.
- Eliminated check in `Flags.Make` for zero flags so we don't fail when a flag is zero.

  Often, flags that are not available are set to `0` (for example `O_CLOEXEC` is not
  available on all systems).

- Changed the `Stable` unit tests for `Time.V1` to actually use `Time.V1.sexp_of_t` instead of an independently defined function.
- In the C stubs, factored out code for converting between `timespec`s and `double`s.

  ```c
  struct timespec timespec_of_double(double seconds);
  double timespec_to_double(struct timespec ts);
  ```