Initial board display + dimensions

We start by making a design decision -how do we model the board that
tiles are save don?

To this end, we'll use a sparse matrix, implemented as a dictionary from
the location (x, y) to the tile itself (temporarily represented by a
character).

That decided, we can display a basic board -- but first, we need the
board's dimensions, so we know what X/Y range to draw in.
Added 'available_spots' function and test

To ensure a user's move is legal, we need to know the list of valid
locations a new tile could go.

available_spots() addresses the first half of this problem: figuring out
all of the potential spots that have an existing tile neighbor but are not
themselves occupied.

Next, we'll need to figure out if our tile actually __fits__ into the
position, but for that we'll need to define the Tile class more cleanly.
Tiles now have edges + text-based display function

We need tiles to have edges in order to figure out what goes where.

As a result tiles now have TileEdges, which tells them what goes where.

We want to eventually build a prettier GUI, but for now I whipped up a
(pretty ugly) console-based display function
added support for figuring out where pieces fit

So far not including rotations, but that is the next step.
added tiles resources
added a (hopefully) bug-free tile mapping.

next, going to move to better (web-based) rendering and going to see
whether I have actually mapped things correctly
removed debug and refactored display to return a string
added simple web interface, still using text though
added tiles csv (TODO - test them)
use tiles CSV to display all tiles (in text) on board
factored out displaying on web
initial use of jinja templates to display
added support for basic displaying tile images

still need to test that our tile coding is correct, then handle
rotations, then make the computer play a single player game via brute
force.
merging w/ github