(WIP) Cdodge/shopping cart rewrite

I guess this isn't really part of this PR, but I don't know why lines 217-226 in this function (the `try ... except ... else` block for `RegistrationCodeRedemption`) should be nested in line 216's `except CouponRedemption.DoesNotExist:` block.  Can you change the that to
```
except CouponRedemption.DoesNotExist:
    pass

try:
...
except RegistrationCodeRedemption.DoesNotExist:
...
else:
...
```
?
Logically, these cases are basically parallel, since we should try to delete types of redemption anyway, so let's make the syntax indicate the parallelness.