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 anything that `ActiveRecord::Sanitization.sanitize_sql_for_conditions` accepts.
I'm a little unsure what the side effects will be of my changing this from:

```ruby
table = Arel::Table.new(table_name, arel_engine).alias(default_table_name)
```

to:

```ruby
table = Arel::Table.new(default_table_name, arel_engine)
```

It seems straightforward enough, but I have no idea how this could affect other areas of ActiveRecord.