How to restrict access to content based on roles (multiple levels) and show a public preview?
I would use Panels.

Basically, for all of your Panel Pages, you would have two variants.

Each variant would have a Selection Rule based on the user role, one for the role and one for not the role.

Then on each, build up the content the way you need.  Personally, I would make a custom node view for the restricted view, so you can use the Node Being Viewed content piece and just configure it to use the view mode you made.

The reason I recommend Panels is that it makes it easier to change things in the future without needing to get special-function modules to cooperate with each other.