Cdodge/shopping cart rewrite

Looking at the actual logic in `remove_code_redemption`, it doesn't look too hard to move into the models (so could possibly be done sooner than later), but of course I'll let you decide the priority on that