Tries to improve encoding handling in `Extractor`

Instead of immediately falling back to returning an unencoded string, we try to
use utf-8 if we cannot accurately detect the content encoding.

This is far from ideal, but since returning an unencoded string brings problems
further down the pipeline (other workers are not able to decode it), this is a
step to reduce this problems.
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).
Adds metadata to the document specifying if the text was forcibly decoded
Merge branch 'bugfix/encoding_detection'