Implement syncing of encryption keys from vault to store

 * Move most of the encryption key types and key derivation logic
   from onepass to key_agent so that it can be used in both
   the local item store and the vault.

 * Make the vault and the local store share a key agent so that
   once the keys have been unlocked either via vault.unlock()
   or store.unlock(), items can be synced between the stores
   since both will be unlocked.

 * Add method to sync.Syncer to sync keys from the vault to the local
   store

 * In web UI setup, kick off a sync of encryption keys as soon as
   the vault is ready.
Trigger item sync when the store is unlocked
Add missing initialization of onepass.Vault.onUnlock
Simplify code for making crypto ops async

Use net/rpc to simplify the code for performing
crypto tasks in a web worker
Remove unused imports and fix use-before-decl lint error
Simplify several uses of rpc.call() using makeNodeResolver()

Use Q.Deferred<T>.makeNodeResolver() to simplify bridging
RPC calls and promises.
Tidy up and improve security of randomBytes() impl

 * Remove support for environments that lack a native
   PRNG suitable for cryptographic purposes.

   window.crypto.getRandomValues() is available in
   IE 11, Fx 21, Chrome 11, iOS 6 and later.

   If in future we decide that we want to support older
   browsers, CryptoJS' Math.random()-based PRNG could
   be re-introduced. Until then, favor security.

 * Use prefixed window.msCrypto in IE 11 and add
   missing typings for window.crypto for other browsers.

 * Remove a duplicated copy of randomBytes()
Add section with details of supported browsers for the first stable release

TL;DR - First release will aim to support current stable releases
of the major desktop and mobile browsers.
Add a sync progress notification bar

This is displayed at the bottom of the app view
during sync
Add fade in/out animation for sync progress notification
Improve sync progress reporting

 * Add a state property to the sync progress reporting to
   facilitate showing the correct state at the start of the sync
   when enumerating items to sync.

 * Start work on test for sync progress reporting
Fix sync progress reporting test

Syncer.onProgress emits the same object in each call but
with mutated properties. Clone the object on each emission.
Fix syncItems() promise not resolving if there were no changes to sync

Sync never entered the 'SyncingItems' state so the check for
state == SyncingItems && updated == changed never passed.
Implement syncing of deleted items from vault to store

Add option to ItemStore.listItems() to also list tombstone
entries, which is needed in order to sync deletion of items
from the vault to a local store.
Add test for error case when trying to sync a locked vault
Add a test for syncing a vault with 100 items
Add partial support for detecting conflicting writes in VFS.write()

Support throwing an error from VFS.write() when writing an update
to an existing file based on a non-current version of the file.

This is work towards fixing a problem in onepass.Vault.saveItem()
where concurrent updates to the contents.js file can clobber each
other and result in items being lost from the index.

Add a 'revision' property to the result of VFS.stat() and
a 'parentRevision' property to a new options struct for VFS.write().
If the 'parentRevision' property is set in VFS.write() and does
not match the current revision of the file, the update fails
with a vfs.ConflictError.

In Dropbox, this maps to the API's mechanism for detecting conflicting
updates.

This system currently isn't completely reliable for the Node FS-based
VFS since the file mtime + size is used as a revision and the mtime only
has a resolution of 1 second in Node 0.10 and on OS X across all Node
versions.
Tidy up VFS tests

 * Use promise chaining to clean up code flow in promise tests
 * Fix an issue where localstorage VFS tests could fail
   if they executed quick enough that the same item was saved multiple
   times within a millisecond
Implement Map.forEach() in polyfill
Fix clobbering of contents.js updates by concurrent Item.save() calls

When multiple items are being saved in an Agile Keychain vault,
the updates to contents.js could clobber each other.

Fix this by only allowing one update of contents.js by a onepass.Vault
instance at a time.

When Item.save() is called, the update is enqueued and process to
write an updated contents.js file is scheduled. If Item.save() call
happens concurrently, it will either get picked up by the
already-scheduled update or another one which will happen when the
first completes.

When the keychain is stored in a remote VFS, eg. Dropbox, this also
reduces the number of API calls made to update the contents.js file.