use respond_{to/with} in promo checkout controller

Fixes #2381
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