Refactor to allow custom fetchers, add PhantomJS fetcher