Fix @cached_property

Storing cached values in a dict on the descriptor is a bad idea because
the values will persist after the object the value was cached for gets
garbage collected (i.e., it causes a memory leak).

Using the object's `id()` as the cache key is an even worse idea
(actually, it's a *terrible* idea) because after an instance is garbage
collected, it's memory address can be reused, which can lead
a previously cached value being returned for a new instance.

The (obvious) solution is to store the cached value on the instance
itself.