feat: add utilities to perturbation to iterate through wrappers easily Make PerturbationOperator implement Any, allowing it to be downcasted. Make WrapperPerturbation for perturbations that wrap other perturbations, such as the mutation perturbation and bounded perturbation. Make ListWrapperPerturbation for pertrubations that wrap multiple pertrubations, such as the combined perturbation. This should allow for easily looking through perturbations, finding all perturbations of a specific type and modifying them. One use case can be for changing the probability of a mutation perturbation during evolution.
feat(binary_string): add single bit perturbation, flip perturbation
refactor: pass rng as argument Instead of having the Rng stored inside the structs, pass it through the functions. This means it's no longer necessary to pass perturbations etc. as mutable.
refactor: do perturbation in place instead of cloning
feat: add mutation and combined perturbations
chore: move env to codes/eoa_lib