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.

自分で`message`を定義しないで`initialize`で`super`してメッセージを設定してください。

```ruby
def initialize(raw_volume)
  super(raw_volume.inspect)
end
```

（`super("volume must have one of 'address', 'slices' or 'replicas': #{raw_volume.inspect}")`とかの方がいいかも。）