Fix memory leak in handledKeydownEvents for repeated keydown events

`handledKeydownEvents` leaks when a keydown event 'repeats' (ie. the user holds the key), since we only remove one of the keydowns corresponding to the current keyup event. This PR instead uses a `filter` call, which removes all the keydown events that relate to the keyup and prevents the leak.
@mrmr1993.  Perhaps I'm still not understanding this, but....

This logic looks wrong, and the opposite of the original logic:
- In the original logic, `DomUtils.suppressPropagation(event)` is called at most once, and only when we find the (first) `keydown` event which matches `event`.
- In the new logic, `hasHandledKeydown` is set (and later `DomUtils.suppressPropagation(event)` is called) if we find a `keydown` event which *does not* match `event`.

To get here:

    hasHandledKeydown = true # We've found a matching keydown!

We have to have found some artefact of `event` and `keydown` which *do not* match.

(Am I losing my mind?)