Move transfer creation logic into the dashboard

Currently a surprising amount of logic that goes into creating a transfer happens in the clientside JavaScript in the dashboard. Unfortunately, this means that interrupting the dashboard during a lengthy file copy—for instance, if the user's connection is lost, or if the user closes their browser—then a "zombie transfer" is possible, leaving an incomplete transfer that will never appear in the dashboard.

No further information or input is needed from the user at this point, so it's easy to move this logic into the dashboard instead.