Tough questions.
I think Empty cache should probably clear the page cache and recurse its way though all the cached tags and clear those as well. That could get hairy and hard to test and maybe it would be as fast (and certainly safer) to just clear the whole cache. There are probably more important things to work on for quite a while.
The versioning discussion probably belongs in another thread, but in my dreams I see it as duplicating SVN, a repository somewhere, checkin and checkout to the Trees, revert, commit, and update for individual elements and for containers and their descendents, and icons in the Trees showing up-to-date, to be added, to be deleted, dirty, etc. Of course we’d have diffs, branching and tagging. Essentially, the current site would be a working copy. In theory, it could be integrated into the Manager in the same way that TSVN is integrated with Windows Explorer (and my code editor). It would be a major undertaking and the support load would be crushing so it’s probably just a bad idea.
Maybe a smaller step would be to just clear the cache and take a user-named snapshot of the whole site (automatically appending the date to the name a la Windows System Restore). It shouldn’t be too hard to do that and give the user a screen that would show the backups and offer to restore to any of them. We could save the whole site in each backup at first, then later graduate to just storing diffs and/or showing diffs between versions.
None of that speaks to your question about (p)reviewing changes before publishing. The only way I can think of to address that is to add "Save Draft" and "Update" to every Save screen. I think it would mean new tables (site_content_draft, site_template_draft, site_snippet_draft, etc.). "Publish" would only show for unpublished Resource drafts (maybe just for Documents). After publication, "Publish" would change to "Update." Some users could have the right to "Save Draft" but not to "Update" or "Publish." The easy way would be for the draft tables to just duplicate the current tables, but then you have no option to revert unless the new tables have an extra content field for the previous version.
If we wanted to integrate true versioning into that, we’d have to store a series of diffs in tables, but I think that means a separate table for each individual snippet, chunk, resource, etc. I don’t see a good migration path from the previous scenario to this one, but that doesn’t mean there isn’t one.
I hope at least some of this makes sense.