Hmmm, this turned out to be a monster commit. This change allows the
basket to be able to correctly calculate prices including tax.
It also requires a whole load of test changes since all baskets now
require a strategy instance to be assigned.
Introduce a "Selector" class to load the appropriate strategy
This is required for offline processes where the request isn't
available. We need a way of loading the appropriate strategy class to
determine availability.
This is responsible for picking the appropriate strategy class for the
session and assigning it to the request.
The strategy class then is responsbile for returning the appropriate
price and availability wrappers for a given product.
A template tag is responsible for calling the strategy class with the
product to get the appropriate wrappers needed in the template.