Support user-provided `public_id`s

When a user-provied `public_id` is given, it may not be unique.
This causes problems when the intent is to replace a file in cloudinary. The
`public_id` of the newly uploaded file will be the same as the old one, and the
AR callback `after_destroy :destroy_file` will run and delete the newly
uploaded file in cloudinary. This commit fixes the issue by explicitly deleting
the existing file and allowing the AR callback to run its course, avoiding the
issue of the newly uploaded file being incorrectly deleted in cloudinary
because it has the same `public_id` as the file it replaces.