Allow array or hash syntax for partial index conditions

This is the newer version of #13353, based off of the latest master. It allows you to replace these migrations:

```ruby
add_index :foos, :user_id, unique: true, where: "status IN (0, 1)"
```

With this:

```ruby
add_index :foos, :user_id, unique: true, where: { status: [1, 2] }
```

It understands any Array that `ActiveRecord::Sanitization.sanitize_sql_array` accepts, and any Hash that `ActiveRecord::PredicateBuilder` accepts. It would've been great to just use `ActiveRecord::Sanitization.sanitize_sql_for_conditions` directly, but its implementation of `sanitize_sql_hash_for_conditions` assumes it is being called from within a `ActiveRecord::Base` class, which this is not. Figured this was a reasonable first pass!
Ohh now I follow, thanks for the explanation! I took a pass at using `Relation` here instead but couldn't get from an Array of `Arel::Nodes` objects to a SQL string. For example, this test:

```ruby
add_index 'ex', %w{ id number }, :name => 'partial', :where => { :number => 100 }
```

results in `Relation#where_values` returning:

```ruby
[#<Arel::Nodes::Equality:0x007fd149baefd8 @left=#<struct Arel::Attributes::Attribute relation=#<Arel::Table:0x007fd14ada7cf8 @name="ex", @engine=ActiveRecord::Base, @columns=nil, @aliases=[], @table_alias=nil, @primary_key=nil>, name="number">, @right="$1">]
```

I'm not sure how to get from there to `number = 100`.

If you don't think it matters here, I'm happy to push my current iteration using `sanitize_sql_for_conditions` to allow for further discussion.