Make SmartVersion a true int

SmartVersion was a class that looks like an int, but the only
differences are the constructor and some methods not defined on
normal ints.  This means that SmartVersion can actually subclass
an int.  We have to switch __init__() out for __new__() and
eliminate the special integer methods, but otherwise it looks the
same, and now isinstance(version, int) will be True.
Cache upgrader Converters instance

Previously, any time we did __setstate__() from an older version, the
entire Converters instance had to be recomputed each time.  This could
be lengthy, so there is obviously the potential for precomputing or
caching.  Here we choose caching, on the assumption that an application
will only need to upgrade from one or two older versions of the object.
We also pre-cache the "identity" upgrader.