Improve store performance for orders with total quantity > 1000

by refactoring Package#add

Before the change => `Package#contents` was an array, and finding content items using `detect` was very costly as per the performance measurements below.

After the change => `Package#contents` is a Set. A set contains only unique items by definition. To properly allow Ruby to compare the `content items` in the set, the #hash and the #eql? methods have to be defined on the `Content Item` class as per this example in the  [Ruby Docs](http://www.ruby-doc.org/core-2.1.5/Hash.html#class-Hash-label-Hash+Keys)


partially contributes to the fix of #5706


```ruby


# Spree 3.0 latest

                           user     system      total        real
1000 Inventory Units:  3.490000   0.060000   3.550000 (  3.732619)
2000 Inventory Units: 10.760000   0.120000  10.880000 ( 11.182196)
3000 Inventory Units: 23.590000   0.210000  23.800000 ( 24.274458)

# commenting out Spree::Stock::Package#add -> #unless find_item(inventory_unit)
# (no comparison is performed)
                           user     system      total        real
1000 Inventory Units:  1.910000   0.070000   1.980000 (  2.165775)
2000 Inventory Units:  3.460000   0.130000   3.590000 (  3.921917)
3000 Inventory Units:  5.400000   0.180000   5.580000 (  6.061517)


# After converting Package.contents to a Set from Array
                           user     system      total        real
1000 Inventory Units:  2.100000   0.070000   2.170000 (  2.376794)
2000 Inventory Units:  3.700000   0.140000   3.840000 (  4.187232)
3000 Inventory Units:  5.620000   0.200000   5.820000 (  6.382836)

```

----
After the change, `#find_item` is only used by `#remove`. Please advise if `#remove` should also receive a better implementation.

Also note the slight change of comparison behaviour between `#find_item` and the `#eql?`. 

Feedback is appreciated!
contents is now a Set instead of an Array. A set is an unordered set of values with no duplicates.

Previously, it would check if the inventory_unit existed in the array, and add it if it didn't. Now it just tries to add it, and if it already exists the Set will not add the item since it's already been added. The lack of conditional itself should not change behaviour, since the duplicate checking is now done by the Set.

However, there is a change in behaviour as you can now add the same inventory_unit multiple times in different states.

Previously,

```Ruby
package.add(InventoryUnit.first, :on_hand)
package.add(InventoryUnit.first, :something_else)
```

would result in one item being in the contents, when now it would result in two due to the way the comparisons are being done. The content items are not equal if their states differ.