KandraPredicate
Represents a single WHERE clause predicate in a Kandra query.
GH #107: column is validated against CqlNaming.isValidIdentifier in requireValidColumn, called from every subclass's init block -- the same basic CQL-identifier-shape check KandraColumnRef already applies to KandraColumnRef.cqlName (GH #33). Before this, the only thing preventing an injected column string from reaching QueryExecutor.buildWhere() (which splices pred.column unparameterized) was that QueryContext.predicates happens to be internal to this module -- an access-control accident, not an invariant of the predicate type itself. Any future public API surfacing List<KandraPredicate> would have silently reopened the hole #51/ISS-051 closed for KandraColumnRef; validating at construction closes it regardless of how a KandraPredicate instance is obtained.