Add engine switch to pick computational backend

At the moment Caffe has a single implementation for computations like convolution, pooling, and so on but different backends for different purposes or conditions should be possible. The `engine` param defines a switch for a layer to select among different computation engines. The engines follow the strategy pattern so that for instance `ConvolutionLayer` is actually instantiated as `CaffeConvolutionLayer` for the Caffe engine.

Note that this first pass relies on the Caffe engine class when it comes to composition (pooling in LRN, sigmoid in sigmoid cross-entropy) and tests. The engine switch should be carried through into these layers.

A new engine to take advantage of this switching will follow when ready.

p.s. the CUDA code in common is shifted to the CUDA includes in device_alternate for housekeeping and the proto is groomed too.