text: Title: CI: Add property-based testing
  Body: Let's adopt Quickcheck-style property-based testing throughout the library.
  
  # Details
  
  There are lots of opportunities in cleanlab to do property-based testing, because it has lots of functions where it's easy to write down a relational property about outputs that should always hold. As one simple example: we might have one function to compute the confident joint and another function to compute just the diagonal of the confident joint; we can write down the property `∀ pyx, valid_prob_matrix pyx → diagonal (compute_confident_joint pyx) = compute_confident_joint_diagonal pyx`.
  
  Systematically adopting property-based testing could help us catch more bugs.
  
  Some [existing tests](https://github.com/cleanlab/cleanlab/blob/master/tests/test_latent_algebra.py#L47) in cleanlab are essentially property-based tests, but they're only being evaluated on a single hard-coded input. Upgrading these to property-based testing should be easy after writing the appropriate generators.
  
  I'd suggest using the [Hypothesis](https://hypothesis.readthedocs.io/en/latest/) library for this purpose. It even has some [support for NumPy testing](https://hypothesis.readthedocs.io/en/latest/numpy.html).