Refactor Selection to have no returns

instead of returning a new population, the selection modifies the
population in-place, mitigating the problem of keeping track of the
generation. Since if you create a new population, one has to also
remember to assign the new population the old-generation number. It was
a design decision to avoid forgetting by not creating a new population
object.