Refactor filtering and mapping for url extraction

We make a few changes to the URLs we extract such as filtering out
URLs that don't match a certain predicate and adjusting the values
that we hold.

This change converts these operations to use a common set of
`filterURLs` and `mapURLs` functions that can be passed a function to
call for each item in the array of *url.URL elements.
I wonder, do we need to prevent in-place editing? Because `url.URL` structs are passed around as pointers by default, I don't think it would be odd to treat them as such in the mapping function and it would simplify our implementation.