ModelSync.Local refactor

This changes how `ModelSync.Local` works internally in each of its
CRUD methods, and how the data is stored inside of `localStorage`.

Previously, all data was stored inside a single key/value pair. This saved
the amount of storage used inside of `localStorage` but duplication of
data was needed in order to properly map models in memory. Bugs were also
found when dealing with change events with MS.Local.

The new storage mechanism works like this. The root key contains a list of
all of the IDs that are instances of that root. For instance:

```
'users' : 'users-1|users-2|users-3'
```

Then, in other keys:

```
'users-1' : '{"name": "Clarence"}'
'users-2' : '{"name": "Eric"}'
'users-3' : '{"name": "Ryan"}'
```

The public API hasn't changed - only the storage mechanism. This also has the
side benefit that it's easier to debug as well.