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. 

yes. advance(source, dst) has the advantage of constructing dst in place, but with inlining that shouldn't matter in terms of perf