Change the rounding type

From what I can tell the rounding type doesn't matter, but who knows
Convert to bytes
cmp is deprecated, use cmp_to_key
Change hex and string conversions.

The vault code at one point (line 59, here) makes a point of encoding
unicode strings into utf-8.  This breaks the unit tests in python3,
which aren't explicitly expecting byte strings.  They almost certainly
should be, but I didn't feel qualified to make such sweeping changes
to the unit tests, so for now I've put in a workaround that causes
python3 strings to remain as they are.

Also, python3 no longer has str.encode('hex')
Change the Binary class and _encode_s method

Bring these in line with the other python3 encoding changes.
Tag objects cannot also be None

This I think is a straight-up bug.
Change the test for sets of strings.

The original code assumed that iterating through a set() would throw
up the contents in a predictable order.  This is not the case, and
in python3 apparently these specific strings are returned in the
opposite order.
Turn a string into a byte literal.

This is required to work in python3.  It should not affect the test.
Change the way the hex is expressed.

python3 doesn't have str.encode('hex'), and reaches those values
with a different expression.  I have replaced the longhand with the
specific values, which should not alter the test.
Modify the test to also accept python3 exceptions.

In python3, IOError (which is apparently also OSError) does not
have a message attribute.
Pass bytes to md5(), not a string, in python3.
Assist 2to3 in dealing with unittest.mock

Apparently "import mock" and "from mock import whatever" are used
all over the place.  As this is pretty experimental, I've just done
a simple find job to fix it.  This works for FreeBSD's sed(1) but
hasn't been checked against whatever else is out there.