Hash table

Tests pass locally, still need some debugging to get travis tests working. nbd!
KeyError is typically raised when we try to access a dictionary with a key that it doesn't have.  A more appropriate exception here might be TypeError, since we've been given an argument that is of the wrong type.