GC on both .off and .removeAllListeners

Perform gc collection on both .off and .removeAllListeners,
extract `recursivelyGarbageCollect`, add `makeShallowCopy` for cleaning
lost of `null` properties, add gc invocation counters `this._gc`.

GC can be controlled via env vars `GC_KEY_THRESHOLD`, defaults to 10000.
Which means that a shallow copy of object will be created if it grows over
that amount of `null` properties.

`GC_FREQUENCY` controls how many calls to `recursivelyGarbageCollect` must be
made before we actually do the GC. Defaults to 50000