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.
Lets try an example:

```Ruby
(1..3).each { |i| Spree::Zone.create! name: "Zone #{i}" }
Spree::ShippingMethod.create!(
  name: 'Method1',
  calculator: Spree::Calculator::FlatRate.new,
  shipping_categories: [Spree::ShippingCategory.first],
  zones: [
    Spree::Zone.find_by!(name: 'Zone 1'),
    Spree::Zone.find_by!(name: 'Zone 2')
  ]
)
Spree::ShippingMethod.create!(
  name: 'Method2',
  calculator: Spree::Calculator::FlatRate.new,
  shipping_categories: [Spree::ShippingCategory.first],
  zones: [
    Spree::Zone.find_by!(name: 'Zone 3'),
    Spree::Zone.find_by!(name: 'Zone 2')
  ]
)
```

Then for zones:

```Ruby
[7] pry(main)> Spree::ShippingMethod.where(name: ['Method1', 'Method2']).map &:zones
  Spree::ShippingMethod Load (0.2ms)  SELECT "spree_shipping_methods".* FROM "spree_shipping_methods"  WHERE "spree_shipping_methods"."deleted_at" IS NULL AND "spree_shipping_methods"."name" IN ('Method1', 'Method2')
=> [  Spree::Zone Load (0.1ms)  SELECT "spree_zones".* FROM "spree_zones" INNER JOIN "spree_shipping_methods_zones" ON "spree_zones"."id" = "spree_shipping_methods_zones"."zone_id" WHERE "spree_shipping_methods_zones"."shipping_method_id" = ?  [["shipping_method_id", 6]]
[#<Spree::Zone id: 3, name: "Zone 1", description: nil, default_tax: false, zone_members_count: 0, created_at: "2014-12-02 15:19:24", updated_at: "2014-12-02 15:19:24", kind: nil>,
  #<Spree::Zone id: 4, name: "Zone 2", description: nil, default_tax: false, zone_members_count: 0, created_at: "2014-12-02 15:19:24", updated_at: "2014-12-02 15:19:24", kind: nil>],
   Spree::Zone Load (0.1ms)  SELECT "spree_zones".* FROM "spree_zones" INNER JOIN "spree_shipping_methods_zones" ON "spree_zones"."id" = "spree_shipping_methods_zones"."zone_id" WHERE "spree_shipping_methods_zones"."shipping_method_id" = ?  [["shipping_method_id", 7]]
[#<Spree::Zone id: 5, name: "Zone 3", description: nil, default_tax: false, zone_members_count: 0, created_at: "2014-12-02 15:19:24", updated_at: "2014-12-02 15:19:24", kind: nil>,
  #<Spree::Zone id: 4, name: "Zone 2", description: nil, default_tax: false, zone_members_count: 0, created_at: "2014-12-02 15:19:24", updated_at: "2014-12-02 15:19:24", kind: nil>]]
```

One query to get all the shipping methods, then one query for all the zones for each shipping method. Total number of queries: N + 1 (where N is the number off shipping methods).


```Ruby
[8] pry(main)> Spree::ShippingMethod.includes(:zones).where(name: ['Method1', 'Method2']).map &:zones
  Spree::ShippingMethod Load (0.2ms)  SELECT "spree_shipping_methods".* FROM "spree_shipping_methods"  WHERE "spree_shipping_methods"."deleted_at" IS NULL AND "spree_shipping_methods"."name" IN ('Method1', 'Method2')
  HABTM_Zones Load (0.1ms)  SELECT "spree_shipping_methods_zones".* FROM "spree_shipping_methods_zones"  WHERE "spree_shipping_methods_zones"."shipping_method_id" IN (6, 7)
  Spree::Zone Load (0.1ms)  SELECT "spree_zones".* FROM "spree_zones"  WHERE "spree_zones"."id" IN (3, 4, 5)
=> [[#<Spree::Zone id: 3, name: "Zone 1", description: nil, default_tax: false, zone_members_count: 0, created_at: "2014-12-02 15:19:24", updated_at: "2014-12-02 15:19:24", kind: nil>,
  #<Spree::Zone id: 4, name: "Zone 2", description: nil, default_tax: false, zone_members_count: 0, created_at: "2014-12-02 15:19:24", updated_at: "2014-12-02 15:19:24", kind: nil>],
 [#<Spree::Zone id: 4, name: "Zone 2", description: nil, default_tax: false, zone_members_count: 0, created_at: "2014-12-02 15:19:24", updated_at: "2014-12-02 15:19:24", kind: nil>,
  #<Spree::Zone id: 5, name: "Zone 3", description: nil, default_tax: false, zone_members_count: 0, created_at: "2014-12-02 15:19:24", updated_at: "2014-12-02 15:19:24", kind: nil>]]
```

One query to get all the shipping methods. One query to do the has and belongs to many (because HABTM is terrible), and one query to load all zones for all shipping methods. Total number of queries: 3 (regardless of how many zones or shipping methods there are). This can be reduced to 2 by replacing HABTM with has_many through, or by writing some gross ActiveRecord SQL.