This alternate update function answers the question: "Did the pressed down
keys in fact change just now?"

You might be wondering why this is a Maybe KeyChange – it's because
keydown events happen many times per second when you hold down a key. Thus,
not all incoming messages actually cause a change in the model.

Note This is provided for convenience, and may not perform well in real
programs. If you are experiencing slowness or jittering when using
updateWithKeyChange, see if the regular update makes it go away.

type KeyChange
= KeyDown Key
| KeyUp Key

The second value updateWithKeyChange may return, representing the actual
change that happened during the update.

Helpers

Note: To find out if a key is being pressed, simply use List.member key keyList.

type alias Arrows =
{ x : Int, y : Int }

Record type used for arrows and wasd.
Both x and y can range from -1 to 1, and are 0 if no keys are pressed.