Create infrastructure for custom table classes

Now one can set which table class TinyDB should use by setting the
`table_class` attribute on the TinyDB class or instance. This
gives us the flexibility to introduce more powerful features in
custom table classes without flooding `TinyDB.__init__` and `TinyDB.table`
with additional special arguments.

This also deprecates the `smart_cache` argument of `TinyDB.__init__` and
`TinyDB.table` in favor of this feature.

Example:

    TinyDB.table_class = SmartCacheTable  # For all new instances
    db.table_class = SmartCacheTable  # For all new tables