serious refactor for consistent Unicode handling

In general, our strategy is to use
``from __future__ import unicode_literals`` and convert to UTF-8 where
necessary. So far it seems to work fine, but I have yet to do extensive
testing.

However, all the tests passed, and I'm fairly certain that the only
places issues could manifest are __repr__ and exception display.