:racehorse: Optimize deprecation capture

* Delay/minimize reading of CallSite properties, which seems to be slow
* Reduce depth of captured stack trace to 3, the smallest useful size
* Replace O(n) searches with O(1) storage structures
Always use the same global deprecations hash

If functions are called directly instead of on the grim object, this
is needed to ensure we always use the same object to store deprecations.