Perfomance improvement and fixes return value in promotion#products

I changed ``promotion#products`` in #2363 and today I realized that there might be situations where the block would return ``nil`` to ``flatten``.  Sorry about that. I don't think it currently breaks anything in Spree core but it may lead to issues when folks try to implement their custom promotion rules / actions.

I'm also wondering why the promo specs takes so much time to run. promotion_spec.rb takes over 3 minutes to run inside Spree repo while the same spec takes less than 10 seconds to run in our custom store. Maybe I'm missing something.