Move transfer creation logic into the dashboard

A bit too much of the transfer creation logic was happening within
the dashboard JS code. Creating a temporary directory, copying there,
then moving that temp directory to the final transfer directory were
distinct actions being performed by the user's browser in JS. This
meant that any interruptions on the user's part (closing browser,
losing connection, etc.) could break a transfer, even though nothing
explicitly was required from them.

This translates the old logic into a new single REST API call that
happens in the dashboard instead.

Fixes #6220.