Encapsulate the creation of `Attribute` objects

This will make it less painful to add additional properties, which
should persist across writes, such as `name`.

Conflicts:
	activerecord/lib/active_record/attribute_set.rb
Require shellwords since it is dependecy of this file

Closes #15919
Merge pull request #15834 from rmehner/allow_proc_and_symbol_for_only_integer

Allow proc and symbol as values for `only_integer` of `NumericalityValidator`
Make the apply_inflections method case-sensitive

Since d3071db1, the apply_inflections method check if the downcased
version of a string is contained inside the "whitelist" of uncountable
words. However, if the word is composed of capital letters, it won't be
matched in the list while it should.

We can't simply revert to the previous behavior as there is a
performance concern (benchmarked over /usr/share/dict/words):

Before d3071db1  135.610000   0.290000  135.900000 (137.807081)
Since d3071db1   22.170000    0.020000  22.190000  ( 22.530005)
With the patch   22.060000    0.020000  22.080000  ( 22.125771)

Benchmarked with http://git.io/aFnWig

This way, the solution is to put the down-case version of words inside
the @uncountables array.
Merge pull request #15845 from robin850/jruby-isolation

Make the isolated tests run on JRuby
`Attribute` should know about its name

This allows using polymorphism for the uninitialized attributes raising
an exception behavior.
Merge pull request #15870 from sgrif/sg-attribute-name

`Attribute` should know about its name
Deprecate automatic counter caches on has_many :through

Reliant on https://github.com/rails/rails/pull/15747 but pulled to a
separate PR to reduce noise. `has_many :through` associations have the
undocumented behavior of automatically detecting counter caches.
However, the way in which it does so is inconsistent with counter caches
everywhere else, and doesn't actually work consistently.

As with normal `has_many` associations, the user should specify the
counter cache on the `belongs_to`, if they'd like it updated.
Merge pull request #15754 from sgrif/sg-deprecate-hmt-counter-cache

Deprecate automatic counter caches on has_many :through
Consolidate testing of update_all type casting

We have several test cases on "tricky" types that are essentially
testing that `update_all` goes through the same type casting behavior as
a normal assignment + save. We recently had another case to add this
test for another type in https://github.com/rails/rails/pull/12742.

Rather than testing this separately for every type which is "tricky"
when round tripping, let's instead have a fairly exhaustive test that
ensures we're getting the correct values at every step for `update_all`.
Given the structure of the code now, we can be confident that if the
type is correct, and `update_all` is type casting correctly, we're going
to get the right behavior for all types.
Move writing unknown column exception to null attribute

Making this change revealed several subtle bugs related to models with
no primary key, and anonymous classes. These have been fixed as well,
with regression tests added.
Merge pull request #15916 from sgrif/sg-test-update-all

Consolidate testing of update_all type casting
Merge pull request #15924 from sgrif/sg-write-unknown-column

Move writing unknown column exception to null attribute
:nodoc: our SecureRandom patches [ci skip]

These methods shouldn't be added to `SecureRandom`, as they are neither secure nor random. The more appropriate place for this seems to be `Digest`, so we should move them there. (Pull request welcomed!)

Marking this `:nodoc:` for now, so we don't accidentally ship it as public API.

See https://github.com/rails/rails/pull/15306/files#r13055862 for details.
Require global_identification in serialisations
fk: `add_foreign_key` and `remove_foreign_key` for PostgreSQL adapter.
fk: add `foreign_keys` for PostgreSQL adapter.
fk: `foreign_keys`, `add_foreign_key` and `remove_foreign_key` for MySQL
fk: generalize using `AlterTable` and `SchemaCreation`.
fk: `:primary_key` option for non-standard pk's.