Partially refactor channel joining to prepare for extended-join merge