Implement exchanges

@huoxito per your request, here is a PR to lay out the initial code for exchanges (on top of commits from two dependent pull requests https://github.com/spree/spree/pull/5055 and https://github.com/spree/spree/pull/5042)

It is more pseudocode than anything else right now, but hopefully gives you an idea of the direction
I do think you make a valid point though