Basically it works like this:
zoomstep defines the number of zoom levels there are in total (minimum is therefore 2: minscale and maxscale).
zoomsnap defines at which zoom levels to snap to a certain value. If, when zooming in or out, one such snap point is passed, the new scale will be set to that value.
This also results in a sideeffect though: there can be more zoomsteps than set in zoomstep.
Futhermore, per default the current zoom scale that would result from liquid scaling will also be used as a snap point, to allow reactivating liquid scaling.
To completely disable liquid scaling, I've added a new attribute: book@zoomliquidscaling. Set that to false to disable liquid scaling.
Lastly, if only the zoomsnap values should be valid scale levels, just set zoomstep to 2, and when zooming in or out you will always jump from one snap to another (because you're guaranteed to "pass" one, as you'd otherwise go from min to max).