MAINT: Add HDF5 files to gitignore
DEMO: Add innovation parameters and autosave to drift LSSM demo 2

Now one can adjust the innovation noise magnitude and lengthscale. Also,
the results can be saved automatically.
ENH: Add a method for drawing random samples uniformly on a sphere
ENH: Add some map plotting utilities
ENH: Add a method for switching the plotter of a node
ENH: Move Haversine distance to utils and implement alpha-beta recursion

Haversine distance function is used to compute distances on a sphere.

Alpha-beta recursion computes the expectations and normalization
constant of a Markov chain. It takes as input the (unnormalized)
log-probabilities of the initial state and state transitions.
TST: Add unit tests for alpha-beta recursion
ENH: Add Statistics class (message type) for all nodes
DEMO: Make plotting of loading matrix in drifting LSSM demo optional
ENH: Major revision of the Statistics system

Statistics class (and its subclasses) are used to define the message
protocol between nodes. It defines the statistics that are sent from a
parent node to the child node. It can be used to define conversions from
a node type to another and to compute statistics for fixed values (e.g.,
for Constant node).

The initialization of nodes converts parent nodes to correct type
automatically by using this system. It also converts non-nodes (e.g.,
numerical arrays) to constant nodes with the correct output.
ENH: Remove default node statistics and remove as_gaussian method

Usually, the user should not worry about node conversions. Thus,
GaussianMarkovChain.as_gaussian was removed and one can use the general
_convert method if needed.

Node statistics default to None, so sub-classes must specify the
statistics object.
DEMO: Update the LSSM demos
ENH: Initial sketching of categorical Markov chains and Distribution
ENH: Implement Distribution framework

Distribution objects perform computations for stochastic (or exponential
family) nodes. Computations are thus separated from the node, allowing
easier use of, for instance, Mixture nodes. Also, some simple function
wrappers of nodes could be removed, for instance, GaussianArrayARD
could be the class for the node instead of a function which creates
the node class in a complicated manner.
MAINT: Remove duplicate ndims from ExponentialFamilyDistribution
ENH: Add categorical random sampling function to bayespy.utils.random
TST: Add tests for categorical random sampling function
ENH: Finalize Distribution class framework. Add ensureparents decorator

Now that the implementation uses Distribution objects to perform the
computations for exponential family nodes, several wrappers and dummy
nodes can be removed. For instance, GaussianArrayARD is no longer a
function, which calls a function to construct a class which is used to
create an object, but it is a class which can be used directly to
construct objects.

One key part of this change is the use of
_construct_distribution_and_statistics method, which constructs
distribution, statistics and parents' statistics objects, and the
deduces the dimensionalities of the natural parameters. Using this
approach, Mixture objects can be created easily by giving a Node class
(exponential family node) as an argument.

Also, ensureparents decorator was created which can be used to decorate
__init__ method of Node classes. It makes sure that the arguments of the
__init__ method are proper nodes of the correct message type. Thus,
initialization is simpler as one does not worry about possible numerical
constant arrays or nodes that have not yet been converted to proper
type. However, the decorator can only be used when
_parents_statistics does not depend on the parent nodes.
DEMO: Update Gaussian mixture demo for the recent changes
ENH: Remove Normal node. Use more general GaussianArrayARD instead.