A Proxy handles connecting to a remote host via a given type of proxy server.
It is implemented by the 'gio-proxy' extension point. The extensions are named after their proxy protocol name. As an example, a SOCKS5
proxy implementation can be retrieved with the name 'socks5' using the function
get_extension_by_name.
Given connection to communicate with a proxy (eg, a
SocketConnection that is connected to the proxy server), this does the
necessary handshake to connect to proxy_address, and if required, wraps the
IOStream to handle proxy payload.