Drag and drop output ref

Spec: https://docs.google.com/a/dimagi.com/document/d/1TjJ3vUjH3Xc_dkYd8pKoErVFjcXkbsYlfClSlcJ9Ic0/edit#

@millerdev
There is a very similar function in core.js. Can you explain why this new one is needed?