Make ~fn non-copyable, make &fn copyable, split barefn/closure types

Part of #3678.  Fixes #2828, #3904.

r? @brson