Linear algebra unifying backend (WIP) - First draft

Structure
============
linalg is divided in modules, for example
```
linalg
 |--- Redux (reduction module)
 |  |--- norm (matrix and vector)
 |  |--- dot 
 |  '--- sum (various sum methods on matrix and vector)
 |--- LinSolver
 |  |--- Cholesky
 |  |--- QR
 |  '--- SVD
 |--- EigSolver
 |  |--- Blah
 |  '--- Blah
 '---Misc (IDK :D)
 ```
Facilities
============
Now, we can set backends in compile time via cmake options. It can be used to
 - Set a particular backend (say, Eigen3) for all the linalg modules via `-DSetLinalgLib=EIGEN3` cmake option
 - Set module specific backends (say, LinSolver) via `-DSetLinSlvLib=EIGEN3` options and so
 - Some default backends are always set. Which backend should be used as default that is left up to API designers (kept it as Eigen3)
 - For users, they can always use any particular backend they want via especially mentioning the backend, no matter what global backend was set initially.
 - All of these are done in compile time for faster execution