Add Groups to Advanced tab of configuration window

This also includes adding an "at least two presets" check and a new
configuration key to base that off of.
Split Presets window into its own module

This will allow easier use from other places in the user interface in
the future and will keep the configurator module focused.
Setup skeleton window for Groups

This is just the bare bones, but allows instantiation.
Make the "list view w/ a button toolbar" common

Moves this off into the common module under the name of "Slate".
Begin wiring up Groups window buttons

Sets up adding, deleting, and refreshing the view.
Allow arbitrary pass-through of ListView arguments

Adjusts Slate common class to allow the arbitrary pass-through of
arguments to a ListView.
Split apart SubListView

Introduces an abstract (and module private) ListView class and a new
GroupListView.
Set up child view for selected groups

Populates a new slate view with the listview implementations stubbed
out.
Split up SubListModel

Breaks up the internal _SubListModel into an abstract base class
_ListModel leaving behind the substitution list-specific stuff in
_SubListModel.
Implement item delegate for group presets

Unlike the other more complicates ones, this one is done using just an
easy dropdown with the user's presets listed out.
Group preset model

Introduces a basic model to wrap around the underlying list-of-strings
used for keeping track of the presets that make up a group.
Finalize open editors in group presets upon save

If the user clicks the "Save" button in the Group Preset editor, search
for any unfinalized open delegate views and commit the changes there.
Drop header from groups on selected group

The selected group name is already in the dropdown, making the header
redundant.
Split off lax dictionary lookups in reviewer

This makes this functionality become re-usable in the upcoming group
parsing functionality.
Basic groups TTS tag parsing support

While this does not hook it into the router, this is able to check and
normalize the group definitions.
Cache all errors in the router

When a service raises an error, that error should be remembered by the
router for the duration of the session.
Visual fixes for groups box

Moves and adds some stretches.
Fix up buggy group serialization

Tries to resolve several bugs with group state not being saved back to
database.
Move most group logic into router

This is going to be re-used by multiple callers, so it will work better
there.
Group playback support implementation

Allows the router to understand how to handle and perform callbacks for
a group of presets. With this, TTS tag group playback works.