Rework how prices, availability and taxes are determined

This is a parallel thread to #439 trying to solve the multi-stockrecord problem but also addressing how taxes are calculated, and availability is determined.

Catalogue/browsing:

- [ ] Product listings showing correct price
- [ ] Product detail showing correct price

Basket:

- [ ] Remove `is_purchase_permitted` from basket form
- [ ] Extend basket line model to track stockrecord

General:

- [ ] Assign controller in middleware
- [ ] Use separate classes for availability and pricing