fix(preprocess): set correct extension for the preprocessed path

Closes #843
feat(web-server): cache preprocessed files

Now Karma does not write preprocessed files into disk (as the web server would read them) and store that in memory. Especially when running with multiple browsers (each browser has to fetch the file), this saves FS access (1 write per preprocessed file; x reads per preprocessed file, where x is number of captured browsers).

This is in trade for slightly higher memory usage. I however tried AngularJS with this change (forcing all the files to be processed/cached) and the memory consumption was not significantly higher.

We can optimize this to clean up the cache, especially if there is only a single browser captured
feat(web-server): use SHA hash instead of timestamps

Heavy caching relies on SHA of the content rather than mtime timestamps.

Benefits:
- touching a file (without changing content) does not re-fetch the file
- reverting a file does not re-fetch the file (browser will use the previous cache)
- changing preprocessor configuration does invalidate cache (Closes #520)
chore: update dev deps to use regular npm packages

As we don't need these unreleased ones anymore...
chore(travis): use "dots" reporters and disable debug logs
docs(troubleshooting) - Add a troubleshooting section

I've spent a lot of time reading Karma issues. I think it would be nice if there was a troubleshooting section with steps that people could follow to try to debug common issues. What do you guys think?

CLA signed: Rob Dodson
feat: add `browserDisconnectTolerance` config option

This adds a new config option `browserDisconnectTolerance`.
docs/config/01-configuration-file.md for more information.

When `browserDisconnectTolerance` is set to 1 and a browser disconnects during a test run, Karma will restart the browser and run the tests again. Only if the browser disconnects again, it will be treated as a failure.

Based on #777.
docs(config): add missing docs for `browserDisconnectTimeout`
refactor(browser): move "result converting" into Result object
refactor(browser): rename browser.onReconnect -> browser.reconnect

This method is not called as event listener on the socket.
refactor(browser): extract Result and Collection into a separate file
refactor: all file names lowercase and snake_case

This is the Node's convention.
style: make jshint happy
docs(faq): add "tests are running slow" question
Merge pull request #844 from robdodson/patch-1

docs(troubleshooting) - Add a troubleshooting section
chore: update contributors
chore: release v0.11.6
fix: reuse browser instance when restarting disconnected browser
fix: keep all sockets in the case an old socket will survive

Before this fix, if another socket.io connection (socket) got established, Karma would forget the old one, expecting the old one will get disconnected at some point. It can however happen, that the new socket will get disconnected.

This changes `Browser` to keep all socket objects.
feat(plugins): ignore some non-plugins package names