Bug 1023664 - Calendar recurring events r=millermedeiros

### Change Summary

#### Functional
+ Create a database migration to create ical blobs for existing, pre-2.1, local events
+ Merge the code paths for `provider.ensureRecurrencesExpanded`, `provider.createEvent`, `provider.updateEvent`, and `provider.updateEvent`
+ Pass flags to the CRUD methods in the caldav worker to indicate whether or not changes need to be persisted to a remote server (since they're now also handling local events)

#### Stylistic
+ Move `Provider.Local` and `Provider.Caldav` into the same module since much of their behaviors are converging here
+ Move offline detection into a separate module
+ Node-style callbacks turned into promises
+ Since we'll only ever have a single instance of the provider(s) running, it shouldn't be an instantiable class (for simplicity like Miller and I talked about)
+ Cleaner abstractions in the provider where we're doing things like streaming things from the caldav worker into the stores (ie `createCaldavStream`, `consumeCaldavStream`, and `pipeToStore`)

### On the way

+ Handling for creating, editing, and deleting occurrences
+ High-level unit tests which will setup the provider, service, stores, and radicale server and then make sure that calling various methods on the provider injects the right things into the stores
I would add a comment at the top of the file explaining why this file exists and what it does, something like:

```js
// the module works as a common API for Local and Remote providers.
// ---
// it exists mainly to simplify the interaction with the database/workers;
// sharing as much logic as possible between local/remote calendar and reducing
// the amount of conditionals through the code.
// most of the implementation is inside the "worker" (for operations that deals
// with ical) or on the "local" for basic actions on the local calendar.
```

like a TL;DR;