add concept of franchise durations for players

Getting this data into the views will require some work, so let's chat about that.

Also, those franchise pages are getting hefty and could use some performance love.

For now, though, this gets us the data. e.g.

```ruby
irb(main):005:0> player = Player.where(id: "baineha01").first
  Player Load (0.3ms)  SELECT "players".* FROM "players" WHERE "players"."id" = 'baineha01' LIMIT 1
=> #<Player id: "baineha01", first_name: "Harold", last_name: "Baines", waa0_tot: #<BigDecimal:7fcad20da210,'0.118E2',18(18)>, war162_tot: #<BigDecimal:7fcad20da148,'0.39E2',9(18)>, wwar: #<BigDecimal:7fcad20da080,'0.601E2',18(18)>, hall_rating: #<BigDecimal:7fcad20d9fb8,'0.55917E2',18(18)>, position: "dh", hos: false, hof: false, eligibility: "eligible", peak_pct: 4.71, longevity_pct: 95.29, runs_bat: #<BigDecimal:7fcad20d9ab8,'0.2314E3',18(18)>, runs_br: #<BigDecimal:7fcad20d99f0,'-0.1E2',9(18)>, runs_dp: #<BigDecimal:7fcad20d98d8,'-0.189E2',18(18)>, runs_defense: #<BigDecimal:7fcad20d97c0,'-0.115E2',18(18)>, runs_totalpos: #<BigDecimal:7fcad20d96d0,'-0.1961E3',18(18)>, pa: 11092, war_pos: #<BigDecimal:7fcad20d9450,'0.386E2',18(18)>, war162_pos: #<BigDecimal:7fcad20d9310,'0.39E2',9(18)>, waa_pos: #<BigDecimal:7fcad20d9220,'0.17E1',18(18)>, ip_outs: nil, war_p: nil, war162_p: nil, waa_p: nil, war_tot: #<BigDecimal:7fcad20d8e10,'0.382E2',18(18)>, waa_tot: #<BigDecimal:7fcad20d8ca8,'0.18E1',18(18)>, created_at: "2012-09-09 23:55:56", updated_at: "2014-03-04 02:47:06", photo_path: nil, bio: nil, first_year: 1980, last_year: 2001, runs_pitch: nil, img_url: nil, alt_hof: nil, cover_model: false, compatibility_id: "baineha01", ranking_overall: 737, ranking_position: 6, ranking_hof: nil, ranking_hos: nil, franchise_rankings: {"bal"=>{:hall_rating=>13.7751738611, :ranking=>134}, "chw"=>{:hall_rating=>36.5068029557, :ranking=>39}, "cle"=>{:hall_rating=>-0.2512845668, :ranking=>1362}, "oak"=>{:hall_rating=>5.2519291318, :ranking=>269}, "tex"=>{:hall_rating=>0.8283083868, :ranking=>353}}, personal_hof: false, hom: false, ross_hof: false, bryan_hof: false, consensus: 0, dan_hof: nil, dalton_hof: nil, nickname: nil, hof_year: nil, hof_via: nil>
irb(main):006:0> player.years_played_per_franchise
  FranchisePlayerDuration Load (0.3ms)  SELECT "franchise_player_durations".* FROM "franchise_player_durations" WHERE "franchise_player_durations"."player_id" = 'baineha01' ORDER BY start_year asc
=> {"chw"=>[[1980, 1989], [1996, 1997], [2000, 2001]], "tex"=>[[1989, 1990]], "oak"=>[[1990, 1992]], "bal"=>[[1993, 1995], [1997, 2000]], "cle"=>[[1999, 1999]]}
```
SPECS OR GTFO is, I believe, what the kids are saying these days.

But seriously, do we want some tests for this?