When you inherit from a package in Spack, you inherit all the metadata from its
directives, including `version`, `provides`, `depends_on`, `conflicts`, etc.
In some cases, you may not want this metadata. This PR adds a new `disinherit` directive
that allows you to throw out things inherited from the base class. For example:
```python
from spack.pkg.builtin.mpich import Mpich
class MyMpich(Mpich):
disinherit("versions") # don't inherit any versions from builtin Mpich
version("5.0", "08721a102fefcea2ae4add8c9cc548df77e9224f5385ad0872a9150fdd26a415")
version("6.0", "9cc39dd33dd4227bb82301d285437588d705290846d22ab6b8791c7e631ce385")
```
Without the `disinherit("versions")` directive, this package would have versions `5.0`,
`6.0`, *and* anything inherited from `Mpich`. With it, this package has only versions
`5.0` and `6.0`.
You can `disinherit` any of: `conflicts`, `dependencies`, `extendees`, `patches`,
`provided`, `resources`, `variants`, or `versions`.
- [x] add new `disinherit directive`
- [x] Two packages were modifying their `versions` dictionary in their constructors to
achieve this, but this causes `spack url stats` to fail with a concurrent
modification exception as it iterates over all packages. Fixed these to use
`disinherit` instead.
- [x] Update documentation
- [x] Add tests