Refactoring the storage backend method signatures

Now everything just takes the image object and handles it's own logic.
For the most part the calculated image is stored as
image.hashed_filename().

This also fixes a bug where deleting images wouldn't actually delete
anything because the save method was being passed "hash.extension" but
the delete method was just being passed "hash".  Now everything uses
hashed_filename()