Instead of having an implicit state machine for a requests
lifecycle move toward an explicit state model and transition
set that is validated and transitioned in a more easy to
understand/reason about manner.
This also fixes a bug that was found due to a response validation
not taking into account a transition that was found due to this
stricter transition checking.
Includes a few tiny related/affected commits:
* Remove testing of request repr() and str() as these types of
tests are not useful and we removed the repr() version of the
request message as the base classes is good enough.
* Raise and capture a better exception and save its associated
failure object when a request has expired (this gives expired
requests better failure objects and associated details).
Fixes bug 1356658
Partially fixes bug 1357117
Change-Id: Ie1386cca13a2da7265e22447b4c111a0a0074201