Confine the logic for adding/removing event listeners between the VM and the components to the relevant components. While this tightens the coupling between the component and the environment, it makes using the individual components more self-contained.
Use fewer refs, these had weird behavior that caused the order of components to matter.
Attach events eagerly, as soon as the necessary objects are available.
Make VMManager an actual class instantiated with a VM so we don't have to pass it to every method.
Use bindAll everywhere for convenience.
While doing so:
- Use ProjectLoader for loading projects
- Stop using loadEmptyProject and supply empty project data
- Move project loading to App, GUI now receives data (as a string - the vm should receive an object eventually)
- Add logging