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は完全にランダムにいずれか1つを選んで検索リクエストを転送すると思っていたので、用途ごとにreplicaを使い分けるという発想がなかったです。
単純なレプリケーション用と思っていました。
用途に応じて使い分ける想定なのであれば、完全に同質な物の配列という扱いのreplicas（現状の自分の想定はこれ）と、それぞれ質の異なる物の集合という扱いのreplicasを、分けて考えた方がいいのではないかと思います。
仮にそれをspecific_replicasと名付けたとすれば、

~~~
datasets: {
  Default: {
    volume: {
      specific_replicas: [
        { label: sliced_replica,
          usecase: ..., // このreplicaが使われるべきケースの条件
          volume: {
            slices: [
              { },
              { },
              { }
            ]
          }
        },
        { label: non_sliced_replica,
          usecase: ..., // このreplicaが使われるべきケースの条件
          volume: {
            replicas: [
              { address: ... },
              { address: ... },
              { address: ... }
            ]
          }
        }
      ]
    }
  }
}
~~~

こんな感じでしょうか。