split code into multiple files

Also, silence some warnings.
use Data.Text and Data.Map.Lazy

The main change in that we now use a hash data structure to keep track
of both the game map itself, and also the minimap. This is much more
powerful than using the raw strings from the imported map file.

Interestingly, using a hash has the added benefit of being
mapsize-agnostic --- i.e., we do not need to know the exact dimensions
of the map any more.
inform player of invalid command
improve grammar
importMap: interpret spaces as nonexistent tiles