Add initial support for Python 3

There is still a lot of work to be done before I'm ready to declare
support for Python 3 complete, but these changes were the minimum
required to get all of the tests to at least pass. Code needs to be
documented better and some parts can probably be refactored to behave
better (e.g., all of the places where `dict.keys()` is wrapped by a call
to `list()` just so I can get the first value).

References #23
Change exceptions to inherit from BaseException

While exceptions can inherit from `Exception`, they should really
inherit from `BaseException`. All of Simon's tests were able to pass,
but the Flask-Simon tests ran into problems without this change.

References #23
Add Python 3.3 to Travis CI tests

References #23
Revert exception inheritance change

I thought I was right the first time, but the Flask-Simon tests were
being weird (still are actually) and I doubted myself.

This reverts commit 40472ef824d63c78843ffff751ad9995570a255b.
Switch to developing using Python 3

I've switched my virtualenv from Python 2 to Python 3. This is the only
line that was unhappy about the switch. I'm adding `NOQA` to tell flake8
to ignore `unicode` not being defined.
Continue transition to Python 3 first with range

The code was already written to use `range()` instead of `xrange()`.
Unfortunately this meant that Python 2 was using `range()` instead of
`xrange()`. `_compat.xrange` (which wasn't being used anywhere) is being
replaced by `_compat.range` as part of the Python 3 first transition.

Any module using `range()` is now importing it from `_compat`.
Add comments to the compatibility module

Some of these probably aren't necessary, but they'll help to keep the
module organized should more things be added to it.
Use the correct iterator for dictionary keys

The `iterkeys()` function in the compatibility module is intended to be
used as a substitute for `.keys()` and `.iterkeys()`. As part of the
transition to Python 3, `iterkeys()` should be used instead of these
methods to make sure an iterator is always returned.

Additionally, the `get_next()` function can be used to allow proper
iteration over these iterators. In instances where only the first key is
needed, using `get_next()` is a better approach that using `list()` and
consuming the entire iterator.

References #23
Remove old meta class association

In 4b544ba, the association between `Model` and `ModelMetaClass` was
changed to an approach that works with both Python 2 and Python 3.
Unfortunately I neglected to remove the `__metaclass__` that handled the
original Python 2-only association. It now serves no purpose and should
be removed.

References #23
Use a tuple for Meta.core_attributes

Tuples are immutable. `core_attributes` should never change. Therefore
it makes sense for `core_attributes` to be a tuple rather than a list.

Yes, I know, and 2 + 2 = 4.

Also, switching from wrapping `'_document'` in a list to a wrapping it
in a tuple saves a `BUILD_LIST` call.