Add ability to specify how a class is converted to Arel predicate

This adds the ability for rails apps or gems to have granular control
over how a domain object is converted to sql. One simple use case would
be to add support for Regexp. Another simple case would be something
like the following:

    class DateRange < Struct.new(:start, :end)
      def include?(date)
        (start..end).cover?(date)
      end
    end

    class DateRangePredicate
      def call(attribute, range)
        attribute.in(range.start..range.end)
      end
    end

    ActiveRecord::PredicateBuilder.register_handler(DateRange,
      DateRangePredicate.new)

More complex cases might include taking a currency object and converting
it from EUR to USD before performing the query. In addition, this allows
special handling for individual columns by passing an instance of
Arel::Attribute to register_handler. This opens up possibilities for
gems to handle cases such as database level encryption, that previously
would have required massive hacks.

By moving the existing handlers to this format, we were also able to
nicely refactor a rather nasty method in PredicateBuilder.