try to make the implementation less confusing by spreading out distinct
responsibilities a bit

git-svn-id: svn://svn.twistedmatrix.com/svn/Twisted/branches/tubes-1956-8@43622 bbbe8e31-12d6-0310-92fd-ac37d47ddeeb