Separate Deploy and Publish steps

Right now, when I publish a site, it is immediately available to the visitors. I can roll back to the previous state, but by default, the latest published version gets live immediately.

What I would want instead is being able to deploy a new version and test it manually or automatically for some time before pointing the public version there only if everything is fine.