Clean-up whitespace for config module

This now uses Unix line endings and 4-spaced blocks instead of tabbed.
Configuration imports and constants

Cleans up the existing imports for the config module and moves around
the constants so that fewer values are exposed as variables.
Remove unused configuration attributes

Pulls out file_max_length and file_extension, neither of which are
currently being referenced outside of the config module.
Configuration key specifications

Breaks out the existing configuration structure into two lookup tables:
one for handling renames from old key names to new key names, and
another for handling the storage types and default values for all the
keys.
Config mappings and additional notes

Introduces int/bool/QtKey type mapping for going back and forth between
sqlite3 and Python, documenting some other possible implementation
details.
Remove TTS_service dict from config module

This is inert; the correct one is in the main module.
Partial Config class implementation

Brings in migration and reading logic.
Expose clean interface for config module

Sets up the __all__ list and creates dummy methods to allow static code
analysis tools to work properly.
Separated module for paths

Breaks the logic for computing paths into its own module, since this is
something that is needed in random places all across the add-on.

Some care has been made to correctly handle symlinks, but edge cases
might exist.
Begin use of paths.relative()

This might avoid a possible encoding bug on some file systems (whatever
necessitated the hotfix need for the 8.1 release). Eventually, all path
formulation needs should go through this function rather than using the
os.path.join and os.path.sep.join functions directly.
Fix path for configuration database

Bug introduced by new paths module; this is supposed to be conf.db not
config.db.
Enhancements to config module get/put

The first parameter is now required for get(), where the omission of
first parameter would be a programming error. The save() method has been
renamed to put() and now takes a dict, which is what the get() method
already returns for multiple names.
Normalize columns during database updates

Because sqlite3 has case-insensitive columns, we must check columns for
existence using a normalized (lowercased) comparison. Otherwise, we
might attempt to add a column that already exists on the configuration
table.
Get existing columns before missing definitions

Having the nested generator in the "if" part of the outer generator
causes the inner generator to be computed more than one, and thus the
underlying PRAGMA call is made multiple times. This can be avoided by
moving the nested call out and into its own variable.
Configuration persistence implementation

This is done by accepting a dict from a calling module, normalizing the
names, detecting which values have changed, updating the in-memory
cache, and writing the changed values back to the sqlite database.
Fix dummy signature for config.get()

Pylint will complain about assignments from this method unless it
returns something.
Bug fix for putting aliases

When consulting the cache, the aliased name was used when really the
actual name should have been used. This can be avoided by doing a pass
to resolve any aliases in the passed list first.
Clean up config interface

Shortens some of the internal instance variables as well as eliminating
some of the complications with interacting with get() and put().
Return immediately from put() if no updates

Instead of attempting to execute an empty UPDATE against the database,
return immediately upon detecting that there are no updates to be
propagated.
Documentation for config module

Adds docstrings and inline comments throughout module.