Also tries to decode text as iso-8859-1 if utf-8 fails to parse it
Always return a unicode object from `trial_decode`

Since the rest of our workflow depends on the text being a unicode object, we
need to make sure this is what we return from our decode process. If even after
trying different codecs we cannot successfully decode the string, we will do it
using utf-8 and replacing invalid chars with the unicode replacement character.

I had to make two decisions here that could be changed further down the line:
the encoding to use and the error handling.  I decided on utf-8 because I think
it is the most common encoding in our use cases and on `replace` instead of
`ignore` so we would have some kind of evidence of where the invalid characters
were (and that they existed in the first place).