Only reload on non assets changes

Fixes #2905

This is a major refactoring of PlayReloader.

* Pulled out all logic to do with watching, jnotify etc into a
  PlayWatchService
* Rewrote change detection/reload logic
* Added some more scripted tests to test things like reload failures