travis: make PATH a global (non-matrix) env variable

This means that PATH is not used to define a build matrix. Travis can
use (combinations of) environment variables to define a build matrix.
Here we just want to set the value globally for the build.
toolbar: add open and download links (fixes #40, #49)

The download link will make modern browsers show a "Save File" dialog,
even for things like images and HTML documents which the browser would
otherwise be able to show. This works in Firefox 30+ and Chrome 27+
but not in IE yet:

 http://caniuse.com/#feat=download
swift: add support for deleting objects
controllers: avoid iterating over items using length

Iterating using explicit indexes and a for loop will not work if
elements has been deleted from the array. We will have such elements
when we begin deleting objects.

The use of of Array.prototype.forEach, Array.prototype.some, and
Array.prototype.every implies a requirements for IE9 and later. I'll
add a note to the README to make this explicit.
readme: make required browser versions explicit
filters: add notUndefined filter

We will use this to filter out the deleted objects from our listings.
Deleting an array entry in JavaScript does not remove it, instead it
is set to the the value "undefined". When iterating over an array with
ngRepeat, these values are still shown, so we need to filter them.
eslint: allow $ and $$ in tests

These are Protractor short-cuts for selecting elements by CSS.
swift-simulator: handle object deletion
containers: implement object deletion (fixes #38)
Merge pull request #55 from mgeisler/travis-global-env

travis: make PATH a global (non-matrix) env variable
Merge pull request #56 from mgeisler/object-deletion

Object deletion
eslint: upgrade to version 0.8.1

Version 0.8.0 changed no-global-strict to global-strict. We now always
require the use of strict mode and allow it in the non-function form.
If we begin concatenating the JS files, we'll change this to require
the function form.
grunt: move Travis ESLint configuration to Grunt (#21)

Install the grunt-cli somewhere global on your system. This gives you
the "grunt" command, which will use the version of Grunt installed
locally for your project.

Then run "grunt eslint" to start eslint with the same options as we
use on Travis.

The explicit dependency on eslint is no longer needed -- the
grunt-eslint module has its own dependency on eslint.
karma: update to version 0.12

We will need this version when we begin using grunt-karma in a
subsequent commit. Unlike karma 0.10, version 0.12 no longer depends
on a number of plugins:

  https://github.com/karma-runner/karma/commit/e033d5618a98

We now explicitly depend on the plugins we use.
grunt: add karma tasks (#21)

This adds karma:{unit,single,coverage,travis} tasks. This will let us
consolidate the configuration more in the future.
package: remove obsolete scripts

There are now equivalent and shorter grunt tasks for these scripts.
protractor: upgrade to 1.2

This is the version grunt-protractor-runner uses.
grunt: add protractor task (#21)

The grunt-protractor-runner task depends on protractor, so we no
longer need to depend on it explicitly.

The latest version of grunt-protractor-runner is 1.1.4 at the time of
writing. That version moved the installation of the webdriver from a
postinstall script to a pretest script. Without the

  webdriver-manager update

call, one cannot run protractor. With grunt-protractor-runner, the
webdriver-manager script resides in

  node_modules/grunt-protractor-runner/node_modules/.bin/webdriver-manager update

which is a quite unwieldy path. So instead of referencing it from our
package.json file, I opted to use grunt-protractor-runner 1.1.3 which
knows how to run webdriver-manager automatically.

The update-webdriver and protractor npm scripts are now obsolete, the
latter has been replaced by 'grunt protractor'.
grunt: add coveralls task (fixes #21)
travis: remove now obsolete $PATH setting

All tasks are now executed using grunt and we don't need to invoke
scripts from node_modules/.bin any longer.