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
it took me a few minutes to figure out that this is actually calling the `streamEvents` method on `service/caldav`.. I think we should add comments to the `executeStream` method, since it is hard to understand just by following the code: 

 - open `controllers/service.js`
 - open `worker/manager.js`
   - look the `stream` implementation
   - look at `_addPending` implementation
   - go back to `stream`
   - look at `_ensureActiveWorker`
   - give up
 - grep whole codebase for `streamEvents`
 - figure out that the method `streamEvents` inside `service/caldav.js` is what you want.