Renaming protractor-conf.js to e2e.conf.js, and making the app port configurable via environment variable
Starting with grunt - created tasks for launching the app as well as running unit and end-to-end tests.

grunt - Launches the app with the dev config
grunt test - Runs unit tests (also aliased as grunt test:unit)
grunt test:e2e - Runs end-to-end tests
grunt test:all - Runs both unit and end-to-end tests
grunt test:cleanup - Performs cleanup after running end-to-end tests

** Some important caveats with end-to-end tests: **

Until this issue is fixed:

https://github.com/cri5ti/grunt-shell-spawn/issues/12

It is necessary to hand-edit node_modules/grunt-shell-spawn/tasks/shell.js and remove the call to replace(...) on line 53 (as also explained in the long comment within Gruntfile.js in this commit). grunt-shell-spawn replaces forward slashes with back slashes in any commands you give it, which we don't actually want for the URL in the curl command.

Also, it may be necessary to run grunt test:cleanup multiple times after running end-to-end tests. It appears that child processes spawned by grunt-shell-spawn don't always stop when the parent process exits. This results in 'address in use' errors next time you try to run the tests. The test:cleanup task is a hacky workaround to kill the leftover zombie processes (for the app, and selenium server) by sending HTTP requests using curl (which, by the way, requires that 'gow' is installed on windows). It's already included as one of the subtasks for the test:e2e task, but apparently it doesn't always manage to work the first time, so it may be required to run the test:cleanup task manually afterward.

Really need to figure out a better way to handle this cleanup...