std.algorithm: Fix the hasAssignableElements restriction from HeapSort

This restriction seems unnecessary (as HeapSortImpl uses swap/swapAt,
which does not require assignability), and was getting in the way of
e.g. sorting a range of Refs. The range can satisfy either
hasAssignableElements, or hasSwappableElements
std.algorithm: Allow proxySwap-using swap overload to take by ref
std.algorithm: Add test for sorting via proxySwap