Devoncarew workspace changes

Refactor how we restore and save workspace roots, This ensures that sub-folders of a parent "projects" folder are properly restored as children of that folder, and not as top-level entries in their own right. Essentially, we play nicer with `chrome.fileSystem.restoreEntry` and `chrome.fileSystem.retainEntry`.

- introduce a `WorkspaceRoot` abstraction
- clients of the workspace API now link in WorkspaceRoots instead of linking in html.Entry nodes directly
- fixes #954
- introduce the `Resource.uuid` field - to replace uses if the `Resource.path` field as a unique identifier for resources
- fixes an issue w/ file paths not being unique identifiers for files - this addresses several problems in the files view. selecting one file might select several; deleting one file might delete several

@keertip