implement something that works like mv, which tries rename first, and if that fails copies the bytes. rename doesn't work across devices