Don't mess with `column_defaults` when optimistic locking is enabled
Merge pull request #15771 from sgrif/sg-stop-messing-with-column-defaults

Don't mess with `column_defaults` when optimistic locking is enabled
Use `column_defaults` in dirty for checking changed defaults

We no longer need to "init changed attributes" from the initializer,
either, as there is no longer a case where a given value would differ
from the default, but would not already be marked as changed.
Merge pull request #15775 from sgrif/sg-use-column-defaults-in-dirty

Use `column_defaults` in dirty for checking changed defaults
Don't assume that Hstore columns have always changed

HStore columns come back from the database separated by a comma and a
space, not just a comma. We need to mirror that behavior since we
compare the two values.

Also adds a regression test against JSON to ensure we don't have the
same bug there.
Merge pull request #15780 from sgrif/sg-dont-always-save-mutable-types

Don't assume that Hstore columns have always changed
[ci skip] fix doc for the Hash#assert_valid_keys
Fix documentation from #15669 [ci skip]