D/W_Comm: touched empty: {dispatcher,worker}/{dispatch,worker}Server.py
D/W_comm: added queue of player-hosts to dispatcher.
D/W_comm: added a StreamRequestHandler that handles connections from worker saying its ready to play.
D/W_conn: added dispatchServer.{DispatchServer,Match} classes

- DispatchServer:
  - inits:
   Runs a ThreadingTCPServer that just listens for workers checking in
  - runs:
   while true,
     generates a random Match;
     pushes that to workers that checked in.
- Match:
  Encapsulates the playing of a match:
  - Which host-player-worker instances are playing
  - What type of player they play as
  - How to generate a random combination
  - How to tell the host-player-workers what they should play
  - Starts the Java GGP game server process.
D/W_comm: added worker.WorkerServer class:

- init:
  - sets fields to keep track of our address/port, and dispatcher
- announce_ready:
  - Opens up a socket to the dispatcher, tells them our address and port
- wait_and_play:
  - Opens up a socket to the dispatcher, listens for player type
  - Starts a Java player instance of that player type, with our port
- run:
  - Just does announce_ready() and wait_and_play(), back and forth,
    forever.
py-dispWorkComm bugfix: dispatcher.ggpServerProcess.to_args:

- to_args was suposed to return a list of the args; didn't
- args returned by to_args were in the wrong order for the Java program.
py-dispWorkComm bugfix: json fixes:

- json.load() can only take readable streams, json.loads() is for
strings
- the dictionary returned by json.load() has to be array-accessed, not
  dot-accessed.
- missed an import of json package in worker/workerServer.py
py-D/W_comm bugfix: corrected static ready-host queue.
py-D/W_comm: redid waiting on queue myself, instead of blocking get. Blocked everything, far as I could tell.
py-D/W_comm: for loop over range(), not a number.
py-D/W_comm: constructed Match without tourneyName.
py-D/W_comm bugfix: forgot to start the ready-worker server
py-D/W_comm: removed a couple of player types that shouldn't be done randomly: human, kiosk.
py-D/W_comm: worker can have port specified, b/c two on one computer.
py-D/W_comm: made PlayerHost fields public.
Merge branch 'py-dispWorkComm-bugfixes' into py-dispatchWorkerCommunication--Finished bugfixes.
Merge branch 'develop' into py-dispatchWorkerCommunication--Upstream changes.
Merge branch 'py-dispatchWorkerCommunication' into develop--Finished communication.

Not that it's bug-free.  But it works, slash, where it crashes is an oddness
with the game player, not with the Python socket stuff.