Cleanup hyperlink code and APIify

More work could be done to simplify the `detector` strategy pattern, but that's now confined to the internal classes, so can be simplified any time.
This does not enact the behavior of the comment (If `f(end)` returns an offset less than `start`, it will round it
+     *  up at `start`.), unless it is the case that `region.gettOffset == 0` since IIUC the second argument to `Region()` isn't a length but an offset.. FWIW The comment looks worst than the implemented behavior to me.