text: Title: Remove cached-property dependency
  Body: I think we should remove our dependency on `cached-property`, for a few reasons:
  - We use a very minimal piece of functionality we can easily replicate and improve upon ourselves.
  - It isn't type-hinted, and the open issue for it is over a year old with no activity: https://github.com/pydanny/cached-property/issues/172
  - The lack of type hints means that we have to always suppress `mypy`'s `disallow_untyped_decorators` rule. It also means that `@cached_property` properties return type `Any`, which makes `mypy` even less useful.
  - `@cached_property` doesn't inherit from `@property`, causing a number of other type issues. Here's the tracking issue for it, which has also been inactive in many years: https://github.com/pydanny/cached-property/issues/26