Preserve user supplied JOIN order

JOIN clauses order is important, previous implementation has always put string or arel joins at the end (after auto-generated association joins).

Fixes #12953, #15488, #16635.

/cc @tenderlove
Similar - confusing lazy initialization to an array, vs always returning an array.