use cabal to build executable

This uses cabal to build, cleans up some -Wall warnings, and adds a few obvious performance fixes (although using ByteString everywhere may be a better solution). There are some lingering correctness issues such that it's possible to type in a word that's not close enough to one that's already in the map and you'll get an exception (choices and chooseBest need to be refactored appropriately).