read/write, memory, labeled training

1. Reworked the read/write system significantly. This is not a back-compatible change. The system is significantly more simple now, with no registry, and only involves the Distribution.__str__ method to be able to reconstruct the distributionn using eval(). Distribution objects do not have a read/write method anymore. Biggest change noticable to the user is that in the file defining the model, states are "<ID> <name> <Distribution>" instead of "<name> <Distribution>", because names cannot be guaranteed to be unique, especially since we're allowing tied states. Currently there is no support for re-tieing states after reading them back in. 

2. Memory of the model is now proportional to 2*n_edges instead of vertices**2. This is very useful in very large, sparse, models, like profile HMMs. There is no memory impact in this change. This does not return sparse matrices for other parts, for example, the forward DP matrix is still the full size. 

3. Training by feeding the model labelled sequences is now supported using Model.train( algorithm="labelled") or Model.train( algorithm="labeled") in a cython-optimized fashion. Since Viterbi training is a superset of this training algorithm, the python implementation of Viterbi training has been removed, and simply calls this function after discovering the Viterbi path for each unlabeled sequence.