Implemented the first stage of using the RespondStateMachine.  The initial state does not invoke it's on_entry method on creation, so I've added an initial state which is immediately signaled in the constructor.  We also now conditionally send an UnchokeMessage if the Peer is interesting.  This needs to be reevaluated when something happens which could make the Peer interesting later.  That is if a HaveMessage is received the interesting evaluation needs to be done again.
Fixed a test ordering bug.  The HaveMessage handling test left the state of the default BlockDirectory changed which falsely indicated that a peer was interesting when it wasn't depending on the test run ordering.  The test now cleans up and verifies clean up.  I also added a method for clearing either the blocks or the peers of a piece.  Finally, the default Peer is now selected at random across runs instead of just using the first peer returned by the tracker.
The RespondStateMachine is now being integrated with the Peer.  It works From disconnected -> neutral.  It reevaluates interest on Bitfield / Have messages by going neutral -> neutral.  It sends UnchokeMessages and goes from neutral -> wait_interest.  A real logging solution is needed before further progress can be made and these changes can be merged into master.
Added logging so test runs don't spew to console.
Added a write thread to the Peer class.  Removed the unnecessary disconnected state and connect events from both state machines.  Improved the test for connect/disconnect to validate thread states.  Made the send machine up to date with a Peer member and appropriate logging.  Improved the resond machine's logging as well.
All messages and states now accounted for except for sending Request, Piece, Cancel, and Port messages.
The simplest form of download now works.  The send state machine sends a request message on entry.  When a piecemessage is received and the machine is still in the send state it transitions to itself, and so sends another request.  This inefficient as it maximizes latency.  Some queue should be created to keep for example, 10 messages always as outstanding requests.
The BlockDirectory will now report to the Swarm when a piece is finished so it can broadcast a HaveMessage to all the peers in the Swarm.
Significant logging additions.  Swarm can end to end download pieces now.