Install the Members Plugin, create a role for these users (or reuse the author role) and do not give them the publish_posts capability.
Here is a screenshot of how I handle this case on one of my clients site:
Update
To forbid publishing of edits you have to hook into the action transition_post_status
and watch for changes. This actions tells you the old and the new post status and the post id:
add_action('transition_post_status', 'my_watcher', 10, 3);
function my_watcher($new_status, $old_status, $postid)
{
// Get post content etc.
$post = &get_post( $postid );
// Compare the content and/or the status, do something.
}
In my case, this was overelaborate, plus we were afraid, users would feel patronized too much.
I just made a dashboard widget¹ to list all changes for admins an editors. Now the users see their edits immediately live. The editors clean things up if needed. Works great. The users learn how to make good edits, that aren’t touched again, and the work for the editors declines over time. :)
¹ Be aware: All text strings are in German, you may have to edit them. I didn’t had the time for I18n, sorry.