Refactor QUnit handling; Use grunt.log/grunt.verbose; JSHint

Lint:
* Move jshint options into separate .jshintrc file so that
  editors with jshint support will pick it up for real-time
  inline validation.
* Fixed spacing in Gruntfile (some of the browser properties
  were indented with spaces instead of tabs).
* Include bin/ and test/qunit/grunt-saucelabs.js.

Grunt:
* Rename _browsers to browsers.
* Set detailedError to true for QUnit. The detailed output
  is a more readable and less overwhelming than it used to be.
  I'd say its in a state where I woulnd't know why you wouldn't
  want to turn it on (perhaps remove the option later).
* Per comment on ab09ae8984, don't run 'npm-publish' by default
  from 'npm test' or 'grunt'. Instead created a task group called
  'release' which does test + publish. The default is to do test.
* Change qunit urls from main+logs to main+async because the logs
  test suite of QUnit apparently broken (in normal browsers as well).

Package:
* Removed internal properties that aren't supposed to be
  committed to the repository.

Task:
* Added explicit require for 'colors' module.
* Use grunt.log.error, grunt.log.ok and grunt.verbose instead of
  console.log. This way users can choose whether they want all
  that stuff from Sauce-Connect.jar and other verbose debugging
  messages.
  To enable the verbose output, set the '--verbose' flag in grunt.
  http://gruntjs.com/api/grunt.log
* Consistently added [cfg.name] and [Sauce Labs Tunnel] in front
  of each message where appropiate.
* Changed cfg.name to be browser/version/platform instead of
  browser/platform/version. And fixed the bug where it put' two
  slashes in the middle if one of the properties is absent.
* Start retryCount at 1 ("attempt 1, attempt 2, ...")

Task/QUnit:
* Implement a simple reporter plugin for QUnit that aggregates
  the test results via callbacks instead of using the textContent
  of the entire page as the test result (fixes #21).
* In showDetailedError, use this object instead of the textContent.
  And, since it is JSON, iterate through and reduce it to only
  the errors (fixes #29).
* Extract the report.name regardless of showDetailedError so that
  one can distinguish between different test suites.
  Previously it would output "[cfg.name] Tests ran result" multiple
  times for the same browser if there are multiple urls.
  Now it outputs: "[cfg.name] report.name: Success".

Test/QUnit:
* Update qunit JS and HTML files to their latest upstream versions.
  Specifically jquery/qunit@4817861c02, jquery/qunit@8328122ff9
  and jquery/qunit@4f84949.
* Removed local hack which is no longer needed now that we have
  grunt-saucelabs-inject.js.
* Removed unused files.

Issue: #21
Issue: #29
Inject through webdriver instead of original html.

However still needs one small modification: autostart=false.
Because webdriver.get() callback is after the document is ready
and all scripts have loaded.

Which means tests would have already began when we register our
hooks, which means we miss the first tests (if not, all tests).

This is still a bit hacky because now it doesn't work when opening
the html in a browser directly, because nothing calls "QUnit.start".