implement basic spelling corrector (task 1-2)

Pretty sure everything is working correctly. Right now our accuracy is 361/455.
We might be able to improve this by tuning some of the constants.

Right now it takes about 10 mins to run the spelling corrector; we need to
cut this down by doing some stuff like pruning during candidate generation.
I already prune candidates that have more than 1 invalid word during the
first phase (1-edit-distance word generation).

We should also add more characters (+, &, etc.) to the character set in
candidate generation because some queries use these characters.