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.