4.0 wip

As previously mentioned in #1369.

In addition to giving us a nicer way to run unit tests, using grunt means that we could easily add other sorts of quality/build steps easily in the future. For instance, it would be trivial to add a lint task that would also run in the watcher.

Just let me know if you have any questions or see anything you'd like for me to change.