I can be done, and is quite easy as long as you allow exclusive locks.
This means that your point 4
4. While UserA makes changes in branch, everyone see and can use version 1.0 of foo. It's not explicit for other users that UserA is doing something in a branch.
is not 100% true anymore. Users can still see and use version 1.0, but they cannot change anything to it anymore.
I would use two databases, lets call them trunk and branch.
You then make sure to version control all packages in your trunk model.
Then you make a copy of your trunk db into your branch db.
From your branch you can then check-out the packages you need.
After the review these packages can then be checked in into the version control system, and you can do a "getlatest" on those packages from your trunk db.
Then you can make another copy of the trunk to the branch db, just to make sure you start clean again.
I will indeed require some discipline to keep branch and the trunk db in synch, and the performance of checkout/checkin for large packages is far from great, but it should be doable.
Geert