Introduce DatasetMatcher to simplify DatasetToolParameter...

This reduces code duplication related dataset_collectors now and abstracts out important functionality I reuse further to collect dataset collections downstream.

Was originally added in 28d43f4 as DatasetParamContext and backed out of right away. I have reworked it so that it no longer breaks implicit conversion, the relevant classes and methods have less generic names, and it has a healthy set of test cases.