Split the building blocks into separate source files

Largely, this PR splits up the monolithic `lib/index` into discrete files which can be required on their own. This, because I see them as being useful on their own, and there is really no reason to necessitate requiring the entire module when you need only a quarter of it. Also, I find it makes the code easier to read (and hopefully maintain), but that's just my opinion.

Unfortunately, for some reason, `jsdoc2md` didn't want to play along with me and thus the documentation is _not_ up to date.