The current Schema#snapshot(long timestamp) interface is limited, for it assumes that users only use timestamp for schema version control, thus we need something new to replace the "timestamp" parameter.
So we'll introduce a SchemaVersion interface with a partial ordering contract that is:
1) Irreflexive: !a.isBefore(a), which means a cannot happen before itself;
2) Transitive: if a.isBefore(b) and b.isBefore(c) then a.isBefore(c);
and 3) anti-symmetric: if a.isBefore(b) then !b.isBefore(a);
User can implement their own SchemaVersion, which, aside from following the partial ordering contract, must also override equals(), hashCode() and toString(), so that user can, through overriding CalciteConnection#createPrepareContext(), create a Schema snapshot of a specific SchemaVersion used by the prepare context.