GA functions

A genetic algorithm requires a number of functions. This package provides the interfaces for those functions and simple implementations. By implementing, mixing and matching these functions you can create highly customized genetic algorithms.

A GA requires (in alphabetical order): a `CrossOverFunction` to govern the behaivour of 'chromosome' crossovers, a `FitnessFunction` to determine the fitness of each organism after each iteration, a `MutationFuntion` to govern mutation behaivour, and a `SelectionFunction` to select organisms for the next round of replication.