this rewrites the gesture event dispatcher to use a hash of hashes for
tracking which events are being watched on a given object to avoid:
- dispatching n gesture events per object to each callback, where n is the number of gesture callbacks for any given type
- removing all gesture callbacks when only one callback is removed
this is not smart code. it should be improved at some time, but that time
is not now.
Depends on D11126