Send a message and return the reply
    
    :param address: a nw0 address (eg from `nw0.discover`)
    :param message: any simple Python object, including text & tuples
    :param wait_for_reply_s: how many seconds to wait for a reply [default: forever]
    
    :returns: the reply returned from the address or None if out of time

def send_message_to(address, message=EMPTY, wait_for_reply_s=config.FOREVER):
    """Send a message and return the reply
    
    :param address: a nw0 address (eg from `nw0.discover`)
    :param message: any simple Python object, including text & tuples
    :param wait_for_reply_s: how many seconds to wait for a reply [default: forever]
    
    :returns: the reply returned from the address or None if out of time
    """
    _logger.info("Sending message %s to %s", message, address)
    if isinstance(address, list):
        raise core.InvalidAddressError("Multiple addresses are not allowed")
    return sockets._sockets.send_message_to(address, message, wait_for_reply_s)