grunt: add start task

This replaces the "npm start" script. I was having problems with a
template file having been sent with a max-age=3600 header, resulting
in my seeing the old version after reloading.

Using a more full-featured static web server will likely be useful in
the future. For one, we can begin serving the bower_components
directory with an expires header. We can also consider serving the app
from a more Swift-like URL.
bower: add angular-bootstrap

This is a series of Angular-native JavaScript UI components. We will
be using the $modal service next for the login dialog and can now use
other services in the future.
karma: include ui-bootstrap

This is necessary for when we begin using the ui-boostrap components
in our code.
auth: move sb-auth-dialog into $auth

This removes the implicit dependency between the two components by
making the $auth service responsible for opening the login window.

Before, the sb-auth-dialog directive was observing $auth.authState and
the directive HTML was hidden/shown depending on this state. This is
now more explicit and streamlined since $auth simply opens the modal
when needed.

I kept the deep indentation in auth-dialog.html to better show the
changes needed. This will be fixed in the next commit.
auth-dialog: fix indentation
auth-modal: standardize on -modal name
auth-modal: use modal-footer
auth-modal: make auth button primary
Merge pull request #64 from mgeisler/auth-modal

Introduce Angular Bootstrap
swift-simulator: avoid hard-coded URLs

To gather coverage data, we will be running the tests from a different
directory (since the JavaScript files will be copied to another folder
when they're instrumented by Istanbul).

So the simulator now uses the same logic as the Swift service to
determine account URL.
package: make protractor a top-level dependency

In a later commit, we will be using grunt-protractor-coverage to
collect coverage data from the protractor tests. That module comes
with a protractor_coverage task which calls protractor -- but without
declaring the dependency.

So we need to make protractor a top-level dependency so that
grunt-protractor-coverage can see it. However, that breaks
grunt-protractor-runner version 1.1.3, invokes webdriver-manager in
its postinstall script. The invocation fails with:

  $ npm install
  -
  > grunt-protractor-runner@1.1.3 postinstall /home/mg/tmp/node_modules/grunt-protractor-runner
  > node scripts/webdriver-manager-update

  webdriver-manager path: /home/mg/tmp/node_modules/protractor/bin/webdriver-manager

  module.js:340
      throw err;
            ^
  Error: Cannot find module 'adm-zip'

Upgrading to grunt-protractor-runner 1.1.4 or later fixes this since
it no longer tries to invoke webdriver-manager. We now invoke it
ourselves before running the Travis tests.
grunt: add update-webdriver task

This moves the job of updating the selenium driver into Grunt.
grunt: add coverage task (fixes #24)

This task is a combination of four other tasks:

* copy from grunt-contrib-copy: copies app/ to coverage/instrumented,
  with some unneeded files excluded

* instrument from grunt-istanbul: adds instrumentation to our
  JavaScript files. The instrumented files are put into
  coverage/instrumented/

* protractor_coverage from grunt-protractor-coverage: runs protractor
  on the instrumented files. This task starts a coverage-collector
  server running on port 3001. The tests are modified on the fly to

  1. Ask the browser for the __coverage__ object which is where the
     instrumented files record the coverage data.

  2. POST this __coverage__ object to http://localhost:3001

  Protractor is done, the total coverage data is collected from the
  coverage collector and stored in coverage/coverage.json.

  The specs glob is listed here again since protractor_coverage
  handles it differently than protractor itself: protractor expands
  the globs relative to the config file and protractor_coverage
  expands them relative to the current working directory.

* makeReport from grunt-istanbul: outputs a coverage report to the
  console and a detailed HTML in coverage/e2e/lcov-report.
travis: collect and upload coverage data for e2e tests (#24)
travis: remove unecessary sleep

We already have sufficient delays in the setup because we spend 4-5
seconds downloading the webdriver.
grunt: make e2e coverage report like karma coverage

Now neither prints anything special to the terminal.
grunt: concatenate coverage data

Despite submitting two reports, we only see the data for the second
report (from protractor) at the moment. Concatenating the two files
should make coveralls.io report the combined coverage result.
grunt: sort loadNpmTasks calls
swift: bring test coverage to 100%
Merge pull request #60 from mgeisler/e2e-coverage

Coverage for end to end tests