SPARK-3711: Optimize where in clause filter queries

The In case class is replaced by a InSet class in case all the filters are literals, which uses a hashset instead of Sequence, thereby giving significant performance improvement (earlier the seq was using a worst case linear match (exists method) since expressions were assumed in the filter list) . Maximum improvement should be visible in case small percentage of large data matches the filter list.
Instead of hardwiring this into the parser, lets create a rule in `Optimizer.scala` that recognizes this pattern.  That will allow this optimization to be more general.  For example it could then easily apply to queries like `... WHERE x IN (1 + 1, 1 + 2, ...)` since it'll happen along with `ConstantFolding`.