#dial pre-join and ringback replacement support

`pre-join` is executed once prior to joining a call, and is passed the outbound call being joined.

`ringback` option specifies either a collection of ringback items to play, or a callback which begins playback and returns something that responds to `#stop!` to stop it.