implement NormalInverseWishart component model

Here's our implementation of NIW, put in the distributions framework.

Several high level notes:
- Not optimized at all (emphasis is on readability)
- Introduces (compile-time) dependency on eigen3 library
- A few functions regarding wishart sampling (with credit in the comments) were taken from matt johnson's [pyhsmm](https://github.com/mattjj/pyhsmm) project
- C++ implementation is templated on the dimension size, with size=-1 indicated variable size (this is the same convention as eigen3). The library provides template instantiation for size \in (-1, 2, 3), the most common cases. 

I generally prefer `static_cast<T>(t)` over `(T)t` just because it's easier to search for bad casts. In this case we might just prefix the loop by

    const size_t row_count = sum_xxT.rows();
    const size_t col_count = sum_xxT.cols();