Introduce a PromotionHandler namespace

There we can put classes resposible for triggering promotion logic in
specific spots of the code base. e.g. Cart when item is added to cart,
Coupon when customer submits a coupon code
Create PromotionRule for coupon codes

As the code is actually a requirement for make the promotion eligible
PromotionHandler::Cart scope only promotions with rules

And exclue promotion with a coupon code rule. The scope method may vary
depending on the rails application as each store may add its own
promotion rules
Fetch promo code by rule

Since coupon code are now a promotion rule rather than just a field in
spree_promotions table
Remove both code and timeframe fields in promo form

Those should be implemented as promotion rules now
Dont validate code presence if rule is a new record

This gives the user a chance to first associate the rule with a
promotion (via UI) and only then actually insert the coupon code and
save the record again
Include coupon code promotion rule partial in backend
Refactor previously CouponApplicator

By adding an error an success accessor instead of always returning a
hash. Improve test coverage. It still depend on some hacky way to ensure
the coupon code has been successfully applied but I believe we can clear
that our once we add an association between promotion and orders on the
database level
Ensure updated order total when coupon code applies

Applying the coupon code before updating and persisting object values
ensure that we have a total that take into account any change intended
by the coupon code promotion
Create new calculator from line item discounts

Set it as default in CreateItemAdjustment PromotionAction as the
previous FlatPercentItemTotal only works for discounts on orders
Rename CreateItemAdjustment class to CreateItemAdjustments

This is because this class needs to be responsible for creating many adjustments for an order's line items, whereas the CreateAdjustment class just applies a single adjustment to the order as a whole.
Revert "PromotionHandler::Cart scope only promotions with rules"

This reverts commit 7d4457f90a3ec94a5e53bf62fbc80d2bce49c650.
Revert "Include coupon code promotion rule partial in backend"

This reverts commit 09eda47b66c66801470684902ed03b3d296499df.
Revert "Dont validate code presence if rule is a new record"

This reverts commit b1b74fadd3ba27c6821b2a14a8627143355f9386.
Revert "Remove both code and timeframe fields in promo form"

This reverts commit 2a061822dd70306930317ef5586bfd79a7d55582.
Remove CouponCode rule

It's better off jsut using a simple field for this rather than having a whole other level of indirection
Fix coupon application to return a useful error if coupon is already applied
Do not activate promotions with codes in PromotionHandler::Cart
Ensure coupon code discounts are shown on the cart page
FlatPercentItemTotal now calculates on a per-line-item basis