Functional tests

Fixes #25.

- [x] Setup intern
- [x] Test unauthenticated index
- [x] Test sign in
- [x] Create mock device that responds to commands
- [x] Bootstrapping script (Phony bootstraps itself by inserting records into the db)
- [x] Test ring
- [x] Test lock
- [x] Test erase
- [x] Extract constants
- [x] Add tests/* directory to JSHint/JSCS Grunt paths
- [x] ~~Attempt to make tests DRYer with `before` and `after` functions.~~ (optimization for follow up PR)
`$ grunt lint` is failing here...

```sh
$ grunt lint
Running "jscs:all" (jscs) task
Empty block found at test/phony.js :
   155 |  } else if (command.e) {
   156 |    // Erase doesn't send back a confirmation
   157 |  }
-----------^
   158 |}
   159 |
>> 1 code style errors found!
Warning: Task "jscs:all" failed. Use --force to continue.

Aborted due to warnings.
```

I'm not a huge fan on the "empty block" rule. We can either tweak/remove the rule, or add a dummy `return` or something.

On that note, curious if we want `npm test` to trigger `grunt lint test` or just `grunt test`.