Updating documentation and typing for PyRosettaCluster (#646)
This PR adds several improvements to the _PyRosettaCluster_ framework.
### Major changes (maintaining runtime functionality)
1. Improve formatting and clarity of docstrings for Sphinx-based
PyRosetta documentation.
2. Consolidate typing aliases into a single
`pyrosetta.distributed.cluster.type_defs` module for easier
maintainability.
3. Add typing to attributes in `attrs` classes.
4. Clean up imports and typing (preserving Python-3.8 compatibility)
5. Add `pickle` and `cloudpickle` warnings to relevant docstrings.
6. Clarify and format logging and error messages.
7. Add `PackedPoseHasher` and `secure_read_pickle` to the top-level
`pyrosetta.distributed.cluster` namespace for easier usability.
### Minor changes (updating runtime functionality)
8. Update usage of `dataclasses` module to use the `attrs` package
instead. Also package Dask task arguments in a new `ExtraArgs` `attrs`
class (with slots and typing) instead of a simple dictionary.
9. Slightly loosen a validation: test whether two Base64-encoded pickled
`Pose` objects are identical -> test whether the scientific state of two
`Pose` objects are identical.
10. Handle edge case of single dictionary outputs from PyRosetta
protocols decorated with the `reserve_scores` decorator.
11. Handle edge case of unordered iterables (i.e., `set` objects) and
raise exceptions: input PyRosetta protocols, and outputs produced by
PyRosetta protocols, must be ordered for reproducibility purposes.
12. Fix exception handling for `Exception` rather than `BaseException`.