Add stub ContentProvider

In preparation for the sync adapter.
Add sync adapter skeleton

The onPerformSync callback is working as expected but doesn't currently
do any syncing whatsoever.
SyncAdapter: Create basic flow for syncing
Save guide to the DB and detect changes

The getStaleGuides function is done, essentially.
Delete unfavorited offline guides

Now offline guides are removed if they are unfavorited.
First stab at downloading images

This is a decent start but ultimately doesn't work because we need to
display progress at an individual guide level as well as a global sync
level. Also, if syncing is terminated before it finishes completely,
guides will be left without some images downloaded until they are
modified.
Rework image downloading to get accurate progress

This addresses some issues present in the previous image downloading
implementation of using a single Set to store all of the images needing
downloading.

To display realtime progress to the user, we must find all images that
need to be downloaded to attain a count. Then we must download images
one by one at a guide-level to make progress on a guide because it
doesn't make sense to download images from guides in an arbitrary order.
It makes much more sense to download all of a guide's images then move
on to the next guide. The total image count will be used for the
notification.
Display notification progress during sync
Minor usability tweaks to the sync notification

Now the notification can't be dismissed until the sync is complete and
is automatically removed if there weren't any changes.
Add progress to offline_guides table

Now we store the total number of images for a guide and the total
already downloaded. This is so we can display progress in the UI and
also so we know which guides have any missing images, if any.
Finish downloading images from uncompleted guides

This makes it so we continue downloading a guide's images if the sync
process failed halfway through. Otherwise we would be left with guides
in a halfway downloaded state and would never be finished until there
was a modification to the guide.
Move notificationid to R.id

This guarantees a unique value to our app.
Remove SpeechCommander

It was causing a decent amount of clutter and hasn't been used for
years. It's easy enough to revive later if we decide we want it.
Initial implementation of viewing offline guides

It involved passing an offline guide flag through a few levels of
adapters/fragments/views to get it to the right place. Also, switched
some of the guide media fragments to use the newInstance() idiom.

The thumbnail code is pretty tricky because it works for viewing and
editing. It's very difficult to determine what tags certain views have
and if the value has the size or not. It's entirely possible that I
broke something with it. We'll have to do extensive testing to find all
the bugs.
Full image view for offline guides

We might want to download a bigger image when syncing stuff but that
will vastly increase the size of data required for offline guides.
Offline guides: Download full image size

Rather than reusing the thumb/main size we just download the larger one
as well.
Offline videos!

Videos on guide steps are now downloaded for offline viewing. This
involved renaming GuideImageSet to GuideMedia because it is used for
more than just images now.
Move GuideMedia to its own file

It will be used to display the offline guides list so we need it
accessible outside of the sync adapter.
Initial OfflineGuidesActivity

It gets the data, now it just needs to display it in a list.
Initial offline guides view