Throughout the system, implement a "simple" (non-configurable) draft workflow where content can be saved as a draft before being published.
As a content editor, I can:
save a draft so that I can preview and share it without publishing to the live site
share a draft URL so that other stakeholders can approve the draft
delete a draft so that the system can remain clean
name a saved draft so that its purpose is clear and so that it can be easily found later
publish a draft so that changes can make their way to the live site
contribute edits to drafts started by other users so that we can collaborate on the draft
create drafts of translations so that translation workflows can benefit from the same workflow
switch between saved drafts when editing content so that I can manage multiple drafts at once
edit multiple fields in the front end and save them against the current draft so that I can preview the page whilst editing
switch drafts on the admin toolbar when editing/viewing the front end so that I can easily see the status of drafts, etc.
publish a draft from the admin toolbar so that I can rapidly publish content as part of a smooth editing workflow
switch to viewing the latest published version in the front end so that I can see the current state of the site
As a system administrator, I can:
limit access to draft creation so that I can control what users can use this functionality
limit access to publishing so that I can control what users are able to publish content
limit access to contributing to draft edits so that I can control what users are able to collaborate in this way
limit access to discarding drafts not started by oneself so that I can control what users are able to remove other users' drafts
Consider using existing version tables and APIs for this. A draft then becomes a "future" version or somesuch. Also, later on we can/will get to a point where we have changesets (PRESIDECMS-415) that can span across multiple different objects and their translations and have some kickass workflow.