I choose not to implement this control flow using an exception because its a path which is entirely expected under certain conditions and is not actually indicative of an error. The  `None` return value from state handlers indicates that there is no valid `next_state` to transition to and that the session should just be terminated immediately. 

As for whether this logic belongs here or not, I've aimed for the following separation of concerns - Where possible, state handler functions don't handle session management,  "error" messages, or cleanup. Thats the job of the `handle_inbound`, function which delegates to the handlers.

I don't mind moving the `publish_error_reply()` call into the actual handlers though.