Introduce new-style connection initiation

`escalus_connection:start/2` is introduced which allows for
explicitly stating which connection initiation steps
are to be performed when making a new connection.
Such an approach allows for easy extensibility in need of supporting new
stream features and for leaving the connection half-initiated (e.g.
after resource binding but before establishing the session) which is
useful when writing "low level" test cases (e.g. testing new
transports).

The function may be called as follows:

    start(Props, [start_stream])

to just connect and send an initiating `<stream:stream>` or

    start(Props,
          [start_stream,
           maybe_use_ssl,
           maybe_use_compression,
           authenticate,
           bind,
           session])

to perform the usual connection with feature negotiation, binding a
resource and establishing a session.
Of course `escalus_connection:start/1` is still available
(and is exactly equivalent to the latter example).

The steps to be performed may be:
- atoms, in which case they are to be
  names of functions defined in `escalus_session`,
- `{Mod, Fun}` tuples,
- funs.

In all cases, the function must adhere to the signature:

    ConnectionStep(Conn, Props, Features)
        -> {NewConn, NewProps, NewFeatures}
        when Conn, NewConn :: #transport{},
             Props, NewProps :: [{atom(), term()}],
             Features, NewFeatures :: [{atom(), boolean()}].

All errors caught from this function will be reported as:

    {error, {connection_step_failed, {Conn, Props, Features}, Reason}}

where {Conn, Props, Features} are the arguments passed to the step
function.