Implement saving and loading of revisions of items

Save each version of an item as a new entry in the local
DB using git-like revision IDs and support loading specific
revisions using Store.loadItem()

This can be used as a basis for merging changes from the local
and cloud stores during sync, for password history and for undo/redo.
Save and load parentRevision to item overview data

This allows the history of loaded items to be followed.
Initial work on a view to add new items
Add cancel/save icons for details view
Defer saving item changes until details view has transitioned out of the way

Having the status messages appear whilst the details view was
being hidden was too visually noisy
Make the IndexedDB implementation slightly more efficient by re-using transactions

Group all operations on the same object store which happen in the same
turn of the event loop into a single transaction.

IDB doesn't provide a way to close transactions explicitly, aside from
aborting them, so there isn't a mechanism to group requests spanning
multiple turns of the event loop into a single transaction
as far as I know.
Make use of the timeout parameter when fetching site icons

To speed up fetching of site icons that have previously
not been queried by the Passcards icon service, set the timeout
parameter to reduce the amount of polling done.
Initial work on implementing syncing of changes from local store to vault

For each item, store a last-synced-at timestamp and use this to check
for changes in the local or cloud ('vault') stores.

When a change is detected on either side, save the result to the other
store.
Implement fetch/saving of last-synced revisions for items

The last-synced revision is updated either after
an update is committed to the vault or after
a vault change has been committed locally.
Implement item revision support in TempStore

TempStore is used by the sync test.
Avoid trying to stringify ItemStore when generating item revisions

Passing the whole item to JSON.stringify() when generating
the item revision string will try to serialize the private
ItemStore member which may in turn reference the item itself.

Just use a subset of the item metadata.
Add test for syncing items from store to vault
Implement syncing of items from store to vault using revision history

Use item revision history maintained by the local store as
the basis for syncing.

When a change is detected in either local or cloud stores, fetch
the last-synced revision of an item and use it to decide whether
to use the local or cloud versions of an item or do a 3-way merge.
Fix revision generation for items and update timestamp comparison on sync

 * When generating item revision IDs, use the current revision rather
   than the parent revision as input to the hashing func, since
   the current revision _is_ the parent of the new commit.

 * When saving item revisions to TempStore, clone the item to avoid
   previous versions of an item reflecting later changes.

 * When comparing item update timestamps during sync, compare only
   at second-level resolution since the Agile Keychain format only
   stores second-resolution Unix timestamps.
Refactor several methods in sync and add documentation
Move TempStore to its own module
Fix createdAt, openContents, faveIndex not being synced from vault to store

Vault.listItems() only returns the index data that is available in contents.js
which does not include the createdAt, openContents or faveIndex fields.

Document this issue and load the full item overview content
when syncing to the local store.
Fix DropboxVFS.write error

Add missing initialization for dropboxWriteOpts struct.
Rename object stores from 'key-store' and 'item-store' to 'keys' and 'items'

The '-store' part of the name was redundant.
This also takes care of wiping old data when upgrading to the
new DB format which multiple revisions of an item's content.
Add comments with schema documentation for local_store.Store