[WIP] Edge/transition features

I tried to replace the node features by edge/transition features (aka dyad features), by assigning `n_classes`² weights to each feature instead of only `n_classes`. The result didn't fit in the memory of my laptop and actually I don't want to waste memory space on it.

This branch contains, so far, a custom sparse matrix datatype based on hash tables that allows adding elements (changing the sparsity). It has a function for multiplying a CSR matrix and a hashtable matrix together.

The implementation may be slow because of all the `malloc`'ing; if that turns out to be unacceptable, we can try a C++ implementation using `unordered_map` or `std::vector` and a custom hash function instead.