Abstract away some types

String and integer types have changed in python 3. In 2.x, the 'str' type is a
string of bytes, and the 'unicode' type is a string of text. In 3.x, the
'bytes' type has replaced the old 'str', and 'str' has replaced 'unicode'. The
six library has abstractions for these that we can use while we're trying to
support both.

Additionally, 3.x has merged the 'int' and 'long' types, so there's a similar
abstraction for that.

There's still a lot of more complicated stuff to do with how we handle strings,
because of the changes to string literals. The stuff where we handle encoding
for diffs will require some special attention, I think.

Testing done: Ran unit tests.
Reviewed at https://reviews.reviewboard.org/r/4907/