move the client implementation to a trait

this will allow us to more easily allow adding hooks
also provide a method to get a String out

not using this as the default ToStr because it's less easy to read
start moving things into callbacks
pass &Message around, since Message isn't copyable