Handle other pk types in PostgreSQL gracefully.

In #10410 it was noted that you can no longer create PK's with the
type of bigserial in PostgreSQL in 4.0.0.rc1. This is mostly
because the newer adapter is checking for column type with the
id column instead of just letting it pass through like it did
before.

Side effects:
You may just create a PK column of a type that you really don't
want to be your PK. As far as I can tell this was allowed in 3.2.X
and perhaps an exception should be raised if you try and do
something extremely dumb.
Merge pull request #10505 from patricksrobertson/bigserial_id_not_identifying_pk

Handle other pk types in PostgreSQL gracefully.

Closes #10505.

- rebased
- test slightly modified
pg, fix Infinity and NaN values conversion.

Before this patch `Infinity`, `-Infinity` and `Nan` were read as `0`.
Merge pull request #13334 from gregolsen/postgresql_infinity

pg, fix Infinity and NaN values conversion.

Closes #13334.

* rebased
* removed guard
* inlined guard into case statement
pg, map `char` and `name` types as string. [dark-panda & Yves Senn]

Closes #10802.
pg, `change_column_default` accepts `[]`. Closes #11586.
test, use `columns_hash[]` in place of `columns.find {}`.
Hash#except is expensive and this is a hotspot, so use a dup + delete
make the module version quack the same as the instance

this way we can stop checking respond_to on every call.
extract route key translation to a method and reuse it
reduce conditionals in url_for
typo: resulution -> resolution [ci skip]
add a test for passing two models to the polymorphic_url method
add a test with three objects
always pass a list to build_named_route_call
remove extract_record since we have extracted the list
stop popping in build_named_route_call
record as a hash is not possible, so rm branch
we always convert this variable to a list, so we can remove the unconversion
only do the Array is_a check once