SpriteDict caches sprites
Remove unnecessary method; delegate to superclass
Very slight cleanup of `load_level`
Remove unnecessary Game attribute (server)

server is defined inside of the `__name__ == '__main__'` block, which
means that it wouldn't be defined if we imported pacman_server.py in a
repl, for instance. Game is also not using it.
Fix string assignment bug

I didn't realize that we needed to assign individual indices of the
string.
Move all initialization into __init__, rename fn

`assign_player_numbers` seemed more descriptive and accurate than
`create_players`.
Move level loading outside of the Game class

This commit also includes a fix for a bug that I introduced in a
previous change. (`portals = [[]] * 10`)

Use a defaultdict to build up the portal correspondences instead of a
list.

Remove some redundancy in initialize_level.

Levels are only loaded once, instead of each time the game is created.
`j` => `forwards` in `update_ent`
Simplify `update_ent`

Instead of iterating over all possible directions, iterate only over
valid directions. Having a set of valid directions also simplifies the
later normal ghost backwards-check.

We had to make `can_go` a bit more robust, taking attempts to move off
the map into account.
Check for membership in a set, not a list

Membership in a set is a constant time operation, while membership in a
list is linear. We also removed '1' from the set, as it's covered by the
`isdigit` case.
Simplify `move`

We thought that the `ds = [...]` was copied enough for it to warrant its
own function.

We collapsed a nested `if` into a single `and`.

It seemed more clear to unconditionally change the position and then
conditionally round than to conditionally change and round.

Well, I think it's clear, but David thinks it's just crafty, though
possibly less clear. :)
Merged refactor from zachallaun
Small changes and comments
Small changes and comments on client
Fixed two small bugs
Fixed small bug that happend when pacman ate a ghost