Allow errors on arbitrary keys to use message i18n

ActiveModel::Errors reads attributes to allow them to be used in
translations for messages. It also allows errors to be added to
arbitrary keys.

Rather than switching on the 'magic' `:base` key, check to see if the
base object responds to the attribute before trying to read it.

By doing this, we allow translations to be used to generate messages for
errors on attributes to which the base model does not respond,
generating more meaningful errors while not relying on strings for the
messages.