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:

- [x] Product listings showing correct price
- [x] Product detail showing correct price

Basket:

- [ ] Remove `is_purchase_permitted` from basket form
- [ ] Extend basket line model to track stockrecord

Dashboard:

- [ ] Adjust product listing
- [ ] Range management
- [ ] Product CRUD

General:

- [x] Assign controller in middleware
- [x] Use separate classes for availability and pricing
- [ ] Variant products!
- [ ] Upgrading guide
- [ ] Deprecate old partner wrapper functionality