Estimator tweaks improvements (performance)

These were part of https://github.com/spree/spree/pull/5676 but I'm moving them here just so we only focus on the `order.contents.add` action there. I was too naive thinking I could review both add to card and the transition to shipment state in one shot.

Dont intend to do any more work here for the time being. Unless someone finds any issue with the changes or we get a broken build it can be merged soon into master. Reviews are much appreciated.
Sorry, I realized that i was a bit incorrect there. The DB queries are efficient, however it will instantiate an object for each of them (which is what you pointed out):

```Ruby
Spree::ShippingMethod.includes(:zones).where(name: ['Method1', 'Method2']).map { |sm| sm.zones.select { |z| z.name == "Zone 2" } }.map(&:object_id).uniq
```

There is the CPU overhead, memory requirement, and garbage collection cost of instantiating each of the zones multiple times. However, I do not think that cost is worth the increase in code complexity with the number of zones and shipping methods that the average store will have.

Do you have a concrete example of somewhere where the object instantiation cost/memory footprint is too high? How many zones and shipping methods are we talking?