Fixed #20488 -- Added copy and move methods to the storage API

* implemented these methods in the default FileSystemStorage
* fix issue with storage tests: each test from FileStorageTests
   was run twice (when inheriting from a TestCase class all test_
   methods are ran in the subclass as well)

Previous incarnations of the same PR:

https://github.com/django/django/pull/1206
https://github.com/django/django/pull/2664

`FileExistsError` is a subclass of `OSError`. I don't like the idea of using that exception (or any other `OSError`) because the Storage interface is meant to be storage backend agnostic. You definitely wouldn't expect an `OSError` when copying or moving a file on S3.

I used `ValueError` as I see this as a generic way of flagging any invalid argument.

I also didn't like the idea of not specifying what the behavior should be when `dst_path` already exists. Having the API clients catching different types of exceptions depending on what storage backends would use would result in a leaky abstraction.

An alternative to using `ValueError` would be to create a custom exception type specific to django's storage API.

Thoughts?