auto persist workspace

fixes https://github.com/dart-lang/spark/issues/2621 - deleted folders showing up when spark is re-launched.

The workspace now auto-persists the roots whenever one of them is modified. Previously, clients of the api were responsible for knowing the persist the workspace after they made top-level modifications.

@keertip
We create a single token / preference for the workspace roots, and write that out as a preference. That write is async. I could return the future from _save here; I mostly just wanted to get the work started to persist the new state.