Keyboard Handling [1/8]: Parse keysymdef.h to produce Unicode -> keysym mappings table

Add a node.js-based tool (utils/parse.js) to read keysymdef.h and produce a JavaScript file
mapping Unicode code points to keysyms.

Also add the generated table (include/keysymdef.js).
Keyboard Handling [2/8]: Core implementation of new keyboard handling

Add keyboard.js, containing the actual keyboard event parsing code.
Keyboard Handling [3/8]: Add unit tests for new keyboard handling

Relies on the libraries chai and mocha (available via npm from Node.JS).

Add anything installed via npm to the .gitignore file.
Keyboard Handling [4/8]: Update input.html to work with new keyboard handling

Plug new keyboard handling into input.js (which breaks everything else), and update input.html to work with this
Keyboard Handling [5/8]: Update rfb.js to connect mouse events to keyboard handler

This allows the keyboard handler to check modifier key state much more frequently

Since some browsers never send keyup events for modifier keys, we have to
synchronize modifier state whenever we get a mouse or keyboard event
Keyboard Handling [6/8]: Update everything to include the new keyboard handling scripts
Keyboard Handling [7/8]: Replace keysym table with optimized version

Regenerate the keysymdef table without -d.

This eliminates keysym names, which are only used for debugging, and shaves ~40kb off the file size
Keyboard Handling [8/8]: Introduce substituteCodepoint() to replace code points which don't have a keysym with ones that do

For now, the only code points this is done for are {s, S, t, T} with comma below (used in Romanian),
 which are replaced by {s, S, t, T} Cedilla.