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. 

Is `group.advance(source_shared, destin_shared)` equivalent to what we've called `source_shared = destin_shared.plus_group(group)` in other distributions? If so and there is no significant performance advantage, could we maintain consistency and move this math to `Shared::plus_group`?