Das liegt aber am Tastaturtreiber und nicht am Javascript. Öffne mal einen Texteditor und halt eine Taste gedrückt und du siehst genau dasselbe Phänomen. Ist imho dafür da, dass beim normalen Tippen auch Leute, die die Taste etwas länger gedrückt halten keine Doublehits generieren.
D.h. es wird gar kein Event/Interrupt vom Hardwaretreiber erzeugt, dann kann auch im Javascript nix ankommen. Die Lösung dafür läge eher auf Betriebssystemebene. In einem Browsergame hast du da allerdings keinen Zugriff drauf.
Was du natürlich machen kannst, ist den timer zu zählen und beim 2ten triggern draufzuaddieren, aber ich glaube das ist für die User weniger transparent und verständlich als das normale Verhalten. Dadurch wird die Bewegung gleichmäßig, aber die Visualisierung hat weiterhin einen Hüpfer.
Die Lösung ist es wahrscheinlich nur das erste keydown/keypress event abzufangen, dann mit einem frei definierbaren, internen Timer die Bewegung zu machen bis das keyup event feuert. Dann kann es allerdings passieren, dass eine Bewegung um genau ein Feld sehr schwierig wird. Am elegantesten ist es wohl, wenn dein interner Timer dabei recht langsam startet und sukzessive beschleunigt, wie z.B. die Maus unter OSX.