Support replicas in a slice

Currently, only RAID 0+1 like fragile cluster is supported.
For safety, each slice in slices should be replicable, like RAID 1+0.
(However, top-level replicas must be there even if RAID 1+0 like structure is supported, because it is useful to migrate an existing slice to new one.)

See also: http://itpro.nikkeibp.co.jp/article/Watcher/20060518/238330/

By this pull request, now there are 3 type volumes:

 1. SingleVolume, is a physical computer.
 2. SlicesVolume, is a collection of <Slice>s.
 2. ReplicasVolume, is a collection of volumes.

A Slice must have one of volumes.
For example:

~~~
  datasets:{
    Default:{
     replicas:[
       {
         slices:[
           { volume: { address:... } },
           {
             volume: {
               replicas: [
                 { address: ... },
                 { address: ... }
               ]
             }
           },
           {
             volume: {
               slices: [
                 { volume: { address:... } },
                 { volume: { address:... } },
                 {
                   volume: {
                     replicas: [
                       { address:... },
                       { address:... }
                     ]
                   }
                }
              ]
            }
          }
        ]
      }
    ]
  }}
~~~

It will be parsed as:

~~~
  ReplicasVolume:[
    Slices:[
      Slice:SingleVolume,
      Slice:ReplicasVolume:[
        SingleVolume,
        SingleVolume
      ],
      Slice:SlicesVolume:[
        Slice:SingleVolume,
        Slice:SingleVolume,
        Slice:ReplicasVolume:[
          SingleVolume,
          SingleVolume
        ]
      ]
    ]
  ]
~~~

Note, currently the top level ReplicasVolume is the Dataset itself.
It is dangerous, so we should change the structure like:

~~~
  datasets:{
    Default:{
      volume:{
        replicas:[...]
      }
    }
  }
~~~

This breaks backward compatibility - v2 catalogs have to be migrated when they are parsed.
So, after the change, catalog's spec version must be incremented to 3.

`replicas`とか`slices`って他で使っています？使っていないなら、メソッドを作らないで`case when`にしちゃったほうがいいんじゃないかと思いました。メソッドにしちゃうと「そういう機能を提供するオブジェクト」という意味もでちゃうので、そういう機能が必要ないなら（そのオブジェクトの役割じゃないなら）メソッドを増やさない方が全体の見通しがよくなると思います。

```ruby
case volume
when ReplicasVolume
  volume.replicas.compute_routes(message, live_nodes)
when SlicesVolume
  volume.slices.compute_routes(message, live_nodes)
else
  [volume.address.to_s]
end
```