* move FileOperation/Copy/Move types to its own UtilTypes module
* remove runFileOp, since it's hard to really do the correct
thing here for all possible exceptions... instead, let the
GUI logic handle this
* introduce copyDirRecursiveOverwrite, copyFileOverwrite and
easyCopyOverwrite
* use our own throwSameFile on functions to distinguish between
"same file" and "file already exists"
* don't follow destination in copyFile* either
* improve throwSameFile, by examining device and file ids
* add isWritable
* improve documentation
* adjust and fix tests