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

...customize line items and the entire cart composition process

Followup to https://github.com/spree/spree/pull/5062 (that PR was for 2-3-stable)
I'm finding in my app if I try to add a new line item to an existing order through the admin system (which uses ```Spree::Api::ShipmentsController#add```), the currency option is not set and so Spree::LineItem#copy_price will copy the currency from the variant.

If the order was in a different currency to the variant then the line_item currency validation fails and the line item fails to save.

My question is: should we do something like ```currency ||= order.currency``` to this method, or should the Spree::Api::ShipmentsController#add pass in the order currency as an option?