HMM: avoid O(N) lookups. This makes HiddenMarkovModelTrainer.train_supervised 30x+ times faster.

Note: demo_pos() execution time is currently dominated by entropy calculations.
cleanup HMM demo functions; tests for HiddenMarkovModelTagger._forward_probability
TST: more tests for HiddenMarkovModelTagger
simplify creation of _NINF arrays in nltk.tag.hmm
fix Baum-Welch probability calculations for multiple observation sequences
small demo improvements; make HiddenMarkovModelTagger.test use standard map/itertools.chain instead of LazyMap & friends
HiddenMarkovModelTagger.best_path uses a cache - it must be reset if transitions, priors or outputs are updated
HiddenMarkovModelTrainer.train_unsupervised must use the same states and symbols as model.

They can be different even if the same values are passed to constructor because HiddenMarkovModelTagger deduplicates them (and change their order).
Even if 'model' is not passed, we should use states and symbols from newly created model (because they may be different).
use enumerate (suggested by @larsmans)
kill hmm._NINF (thanks @larsmans for a suggestion)
Merge pull request #371 from kmike/hmm

HMM improvements