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).
Yes. If the word isn't close to one in the dictionary it tries to get the head of an empty list.