Adds proposed functionality which enhances the ability of extensions to ...

...customize line items and the entire cart composition process

This work is a follow-up to https://github.com/spree/spree/pull/4546.

EDIT: I don't really intend for this to be pulled into a stable branch (2-3 in this case).  I wanted to provide some mostly-working code as a reference point for discussion.  I could then take the feedback and put into a 'proper' PR for master.

Please see: https://github.com/jsqu99/spree_product_customizations (a rework of 1/2 of the spree_flexi_variants extension (github.com/jsqu99/spree_flexi_variants)) as an example of how these changes would be used by an extension.

There's a lot here, but the basic idea is to allow extensions to follow some basic conventions in order to hook into the "add to cart" process without major surgery involving the core spree order code.

Related to this is the ability to know if two line items match and how to instruct spree to make those determinations.

I'll keep the description light here and let the code be reviewed as a first step.

Please see the referenced initial pull request above as background.