Multi-byte safe message truncate

We were running into a bug where the truncate code would get stuck in an infinite loop if the last word was >  the max length (like a really long url). This is a simpler truncation that is respective of multibyte strings and uses recursion instead of a while loop.