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:

```python
TinyDB.table_class = SmartCacheTable  # For all new instances
# or
db.table_class = SmartCacheTable  # For all new tables
```