`FakeRecord`, seperate "changed" attributes and "saved" attributes

When a `FakeRecord` saves, it currently stores changed attributes
in it's `saved_attributes`. This was done in #TODO to better
support the MR test helpers. This "broke" the fake records
`<attribute>_changed?` methods though. They relied on comparing
the current value to what was in `saved_attributes`. This fixes
this by properly seperating out the "saved" attributes from the
"changed" attributes.

The saved attributes needs to always contain every attribute (or
be empty if it's never been saved). This allows the attribute
changed methods to properly detect if an attribute's current
value doesn't match what was last saved.

The changed attributes need to only contain attribute changes.
These can and should only be a subset of all the attributes with
the values they were changed to. It also needs to keep up with
previous changes. This allows the test helpers to properly detect
when a field has or has not been changed and saved. Otherwise,
the test helpers can only detect if it was in the saved attributes,
not if it was "saved" by the last call to `save!`.

This was found as while working on #TODO. It needs to detect that
the `updated_at` hasn't been changed and only then set it to
`Time.now`. I realized that the attribute changed method would
work incorrectly after an empty save. This adds tests to cover
this scenario.