In this commit, I've:

1. added a settings DTO with a new boolean to process an item's descendants

2. locked down the constructor in order to force the usage of two factory methods I added.

3. broke logic into multiple new methods for readability and future maintenance/augmentation.

4. Changed code to use Sitecore.Diagnostic.Assert class instead of throwing AgumentException and AgumentNullException -- Sitecore's class will do this stuff for us.