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.
Paranoid bool conversions

Casts input from the sqlite database to an integer before converting to
a boolean so that if we encountered '0', this is correctly treated as
False rather than True.
Update all modules to use new config interface

This pushes all calls through get() and put().
Avoid unnecessary SELECT after creating database

In this case, we can just use the default values that we know we just
inserted to populate the in-memory cache.
Wrap deserialization in try/except for ValueError

By catching this, we can intercept bad values in the database by falling
back to the "default" value for the particular definition.
Remove TODO for migration checks

These are in good working order.