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
`=> _save()`