Smooth scrolling via requestAnimationFrame, with keyboard repeat

This is a continuation of #1235.

Changes from there:
- Some minor tidy up.
- Handle keyboard repeat (the most recently activated animator keeps going at least until we get a `keyup` event).
- On keyboard repeat, scrolling stops as soon as the key is release.

And, as @mrmr1993 pointed out:
- For distinct key presses, we end up in the same place as we would without smooth scrolling (except for one corner case -- when we're scrolling an embedded element).

Issues:
- ~~See my comment close to where `smoothScrollLock` is set.  There's a race condition.~~
- ~~Also, smooth scrolling cannot be started less than 50ms after the previous smooth scroll completed.  I couldn't trigger this.  Perhaps somebody with nimbler fingers can.~~

I'm on Debian, Could somebody (@philc? @mrmr1993? Anybody else?) try it out on other platforms?
These previous few lines mix the key pressing and the key holding cases in a way that's quite confusing. It might be worth having an outer conditional which separates them, like:
```
delta = Math.ceil amount * (elapsed / duration)
if isKeyStillDown()
  if 50 <= totalElapsed and 0.5 <= calibration <= 1.6
    ...
  delta = Math.ceil delta * calibration
else
  remaining = amount - totalDelta
  if delta < 0
    delta = 0
  else if delta > remaining
    delta = remaining
```