Bug fixes

Require'ing a file that I decided against keeping.

Fix an edge case in pellet-trajectory math: What to do when the target height and the player's height are equal.  This was crashing the game with an attempt to round infinity.  Pesky singularities...
Create Base

Doesn't actually function, yet.  But it can stick to walls or ceilings, just like a player.  It's transparent to players.  And if it falls, it changes its orientation... but unlike a player, it always turns with its "feet" towards the direction it's going, giving it a chance to stick to a wall or ceiling.
Added ghosts; bases are spawn-points

Bases now serve as spawn-points.  A single base is auto-generated in the center of an empty level.  When players connect, they spawn at a randomly-selected, non-occupied base.

Factored out Player as a module.  It only holds methods common to all Player objects.  The original Player is now Entity::Gecko.  (Finally decided on a name for these things.)

We now have a second Player type, Entity::Ghost.  This represents a dead, or not-yet-living, player.  I'll be using this when players die (which they still can't, yet).  They also provide a sort of purgatory for a player who connects while they wait for a base to become available.  Haven't yet provided the means for a Ghost to transition back to being a Gecko; that's next.

GameClient now delegates to the current Player to interpret keypresses and mouse clicks (if not part of level-editing) as moves.  Ghosts can't build, or do anything very interesting.  But they can float around with W/S/A/D or the arrow keys.