use respond_{to/with} in promo checkout controller

Fixes #2381
Improves query to fetch products from line_items

This creates 1/2 less queries when fetching producs from an order's line
items
Makes promotion#products always return an array

In case where rules that doesn't respond to #products are associated
with the promotion this method could break with:

  undefined method `flatten' for nil:NilClass

Fixes #2378