Refactor compare_impl_method to use all bounds

Refactor compare_impl_method into its own file, and change the
code to stop comparing and checking individual parameter bounds.
Instead we now use the predicates list attached to the trait
and implementation generics. This ensures consistency even
when bounds are declared in different places (i.e on
a parameter vs. in a where clause).