CachedDescriptor base implementation
fixed __slots__ properties
always use WeakKeyDictionary as cache for CachedDescriptor