Basic promotion categories.

This allows a promotion to be assigned to a category for better
filtering.

Add ability to search by promotion category.

Manage promotion categories.

Provides CRUD for promotion categories, linked from the promotions page.

Closes #4992
Reduce unnecessary DB round-trips.

Spree::Product has after_save :touch in order to fire
the after_touch callback. But as a result, every Save updates
the product twice. There's no need to call `touch`
after a save if all you want to do is fire the after_touch
callback. So I fixed that.

I also fixed `punch_slug`, which gets called after_destroy,
so it does a single round-trip instead of about six.
After a destroy has already happened, it is unnecessary to
validate the product again, call callbacks again, touch the
product again, and fire all cascading touches again.

Closes #5049
fix failing specs with variant price
refactor the variant price for product.js.coffee. Thanks @gmacdougall
Fix OpenSSL::Digest::Digest is deprecated

For spree master the dependency for 'aws-sdk' is '1.27.0', but that
version has the issue https://github.com/aws/aws-sdk-ruby/pull/434
“OpenSSL::Digest::Digest is deprecated OpenSSL::Digest::Digest is
deprecated; use OpenSSL::Digest for Ruby 2.1 and aws-sdk-ruby”  that is
fixed in 'aws-sdk' is '1.47.0' that is the current version. I did the
bump to '1.47.0' in the spree_core.gemspec file
Adding to Product factory the image attachment