In the isFactor() and factorsOf() methods, I cede control of the loopingalgorithm to the framework — it now decides how best to iterate over the range of numbers.
Now, as obvious a statement as that is in this algorithm, it turns out that is the key to this whole problem being solved correctly without my algorithmlooping infinitely.