Extract behavior from Todo.from_rich_message

`Todo.from_rich_message` was partially tested from the `MessageGateway`, but it is mostly untested and does not belong in `Todo` due to it's role. Extract it entirely into it's own dedicated service object for unit testing.