Refactor data loade mimick static methods via functions

The DataLoader instead of being a class, it is now a module of free
functions, there was no need to make it a class.
Add TreeEvaluator implementation and tests
Add unittest runner
Add the ability to throw away trees that do not evaluate

Some trees during evaluation would fail because of, for example, Zero
Division Errors, such errors cannot be resolved therefore the tree must
be disgarded. The functions and evaluation modules of playground has
been added an Exception to handle such scenarios, which results the
tree being removed from the population without any major problems.
Refactor crossover to be more diverse

Instead of a uniform crossover index, the crossover index are not
guaranteed to be uniform, else the trees which result from this
operation may hinder diversity, the trees could end up having the same
shapes.
Temp fix for mutation

There was a problem when mutating INPUT nodes, in that if there is only
1 input node, the mutation method would loop forever trying to find
another input node that does not exist.
Refactor default score in Tree

The default score in Tree should not be 0.0 else it could be difficult
to determine whether the Tree has been evaluated or the evaluation is
0.0.
Minor Edits
Add reproduction implementation and test
Having problems with crossover and mutation tests

Having problems testing before and after effects of crossover and
mutation. Need a better test to see if there has been any changes.
Add tree node equals tests