Perform the page fetch from an individual host.

    `session` - An aiohttp 
    [client session](http://aiohttp.readthedocs.io/en/stable/client_reference.html#client-session)  
    `host` - URL to fetch

    `return` tuple with the following:
        * The host parameter
        * A vague status string
        * Text response or an exception depending on status above

async def fetch_page(session, host):
    """ Perform the page fetch from an individual host.

    `session` - An aiohttp 
    [client session](http://aiohttp.readthedocs.io/en/stable/client_reference.html#client-session)  
    `host` - URL to fetch

    `return` tuple with the following:
        * The host parameter
        * A vague status string
        * Text response or an exception depending on status above
    """
    await asyncio.sleep(random.randint(0, 25) * 0.1)
    start = time.time()
    logger.info('Fetch from {}'.format(host))

    try:
        response = await session.get(host, allow_redirects=False)
    except aiohttp.ClientResponseError as err:
        # likely a 404 implying HTTP but no page
        # likely a 401 implying HTTP but no access
        # FIXME: for instance, a gateway
        # headers are available via err.headers()
        # https://multidict.readthedocs.io/en/stable/multidict.html#multidict.CIMultiDict
        results_tuple = (host, 'no page', err)
    except aiohttp.ClientConnectorError as err:
        # likely device at IP but no HTTP server
        results_tuple = (host, 'no http', err)
    except aiohttp.ServerConnectionError as err:
        # likely ServerTimeoutError implying no device at IP
        results_tuple = (host, 'no dev', err)
    except aiohttp.InvalidURL as err:
        # likely a malformed URL
        results_tuple = (host, 'no URL', err)
    # except Exception as err:
    #     # Generic trap for debug
    #     results_tuple = (host, 'unknown', err)
    else:
        try:
            text_response = await response.text()
        except aiohttp.ClientPayloadError as err:
            # trouble reading page TODO: anyway to recover?
            results_tuple = (host, 'no read', err)
        else:
            results_tuple = (host, 'found', text_response)
        response.close()

    logger.info('Recvd from {} after {:.2f}s'.format(host, time.time() - start))
    return results_tuple