switch timers to an object with a cancel method
use itertools.count
use namedtuples for messages
add an integration test to run the whole protocol.. currently failing