CLI refactoring - Pass arguments to exec() rather than parsing them out from inside

Also document the meaning of the CLI.exec() return value.
Refactor CLI.exec()

Extract logic for opening and unlocking vaults and
creating the arg parser into separate methods.
Start converting VFS methods to use promises instead of callbacks

Convert VFS.read() and VFS.write()
Convert VFS.rm() and VFS.list() to return promises
Convert VFS.login() to use promises
Add a test timeout of 3s so that async tests which fail to invoke continueTests() fail quickly
Enable source map generation for debugging
Add tests for vfs.FileVFS
Add tests for listing a folder's contents and run VFS tests from an empty dir

As a prerequisite for this, add vfs.stat() and VFSUtil helper
class.
Add test for searching a VFS for files matching a pattern
Remove DropboxVFS documentation that duplicates vfs.VFS docs
Fix VFS stat file test failure if writing the test file happens asychronously

Wait for the file to be created before attempting to stat it.
Add pre-commit hook to lint typescript files

Also fix an error found by tslint in the VFS tests
where the tests searched for a file without waiting for
it to be created first.
Only lint files modified since previous 'make lint'

The tslint command is relatively slow to execute, so
use phony .ts.lint files in the build dir to identify
when a file was previously linted and only lint updated
files when running 'make lint'