Allow for domain information to be stored in a NN.

Each Neuron now keeps track of its own domain. Layer calculates its
domain by concatenating the domains of the Neurons in it.
Architecture calculates its domain by concatenating the domains of
the Layers in it.

PrototypeFullyConnectedLayerBuilder now assigns a domain to each
Neuron. It is also now capable of calculating a Neuron's domain
based on its fanin.
Added NeuronDomainProviders and changed NN problems to use new domain.

Classes implementing NeuronDomainProvider provides the domain needed
for a new Neuron. Current implementations include:
PresetNeuronDomain - uses user-set domain;
FaninNeuronDomain - calculates domain from fanin.

NN problems now read domain information from NN architecture instead
of calculating it from scratch.
Added the use of the new domain providers to the layer builders.

Fixed bug regarding FaninNeuronDomain and PresetNeuronDomain that
did not implement the correct interface.

Removed conflicting/obsolete domain initialisation strategies.

Added the correct usage of the domain providers to the cascade
network problems.

Modified many unit tests to use the new domain providers.

Some code cleaning.
Added LambdaGammaNeuronDomain.

The new lambda-gamma domain provider sets one lambda and one gamma
domain for each neuron. Since this is done for each neuron instead
of an entire network, it implies that NN domains are a bit
different, but shouldn't affect any algorithms.

LambdaGammaVisitor and LambdaGammaSolutionConversionStrategy has
been adapted to deal with the new domain organisation.

Some unit tests had to be adapted.

Inadvertently fixed a bug: LambdaGammaSolutionConvertionStrategy
needs to be initialised, but the initialise method is not called
anywhere. The new implementation doesn't need initialisation.
Initialise method removed as it doesn't do anything.

Some code cleanup.