Matcaffe2

Inspired by PyCaffe, a new and completely renovated MatCaffe interface (although backward compatible).

Now there is class CaffeNet that handle all the interactions with caffe. 

New Features:
- `net = CaffeNet.instance` gets a instance of caffe network using default imagenet_deploy and caffe_reference_model
- `net = CaffeNet.instance(model_def_file, model_file)` gets an instance of caffe network using the parameters specified.
```
net = 
  CaffeNet with properties:

    model_def_file: '../../examples/imagenet/imagenet_deploy.prototxt'
        model_file: '../../examples/imagenet/caffe_reference_imagenet_model'
       layers_info: [23x1 struct]
        blobs_info: [15x1 struct]
              mode: 'CPU'
             phase: 'TRAIN'
         device_id: 0
       input_blobs: []
      output_blobs: []
           weights: [8x1 struct]
```
- Now one can set mode, phase or device_id, just by assigning the properties or using the corresponding methods.
``` net.phase = 'TEST'; net.set_phase_test; net.set_phase('TEST');```
```net.mode = 'GPU'; net.set_mode_gpu; net_set_mode('GPU');```
```net.device_id = 1;net.set_device(1); ```

- One can access the weights of the network just by 
```
net.weights   
8x1 struct array with fields:

    layer_name
    weights
```
-  More amazingly can change the weights of the network by just assigning a new set of weights, for example changing the bias of the first layer `conv1`.
```
new_weights = net.weights;
new_weights(1)                    
    layer_name: 'conv1'
       weights: {2x1 cell}
new_weights(1).weights{2}(:) = 0; 
net.weights = new_weights;
```
- Then one can save the new network in a different model_file
```
net.save_net('path_to/new_model')
```

- And load it later
```
net.load_net('path_to/new_model')
```

More examples about new features to follow.
why the NOLINTs here? please just alphabetize the headers (should be easier than adding NOLINTs) unless there's a good reason not to...