Refactor `meltano elt`, `SingerRunner` and `DbtRunner` to be composable
As @aaronsteers noticed in !2105 (comment 558353646), the SingerRunner
code is a mess of async futures and very hard to understand.
It is currently hard-coded for the tap | target
scenario and will need to be refactored to support tap | transformer | target
(#2300 (closed)) and meltano run tap transformer target dbt
(#2301 (closed)).