PARQUET-116: Pass a filter object to user defined predicate in filter2 api

Currently for creating a user defined predicate using the new filter api, no value can be passed to create a dynamic filter at runtime. This reduces the usefulness of the user defined predicate, and meaningful predicates cannot be created. We can add a generic Object value that is passed through the api, which can internally be used in the keep function of the user defined predicate for creating many different types of filters.
For example, in spark sql, we can pass in a list of filter values for a where IN clause query and filter the row values based on that list.
No it's not about the bounds, it's about adding type safety. If I give you a Serializable, you have to cast it to a HashSet and you have to know that that is going to work.

Instead, if I have a `UserDefinedPredicate<Long, HashSet>`, we have the bounds that enforce that the 2nd param be Serializable, and also when you get handed a HashSet you know it will be a HashSet, not any Serializable. Does that make sense?