Implemented file exclusion handling

### Overview

This was originally a [issue](/wimh/SparkleShare/issues/10) in winmh's SparkleShare fork, but since it's not only a Windows bug it applies to all versions of SparkleShare.

The issue is about file which are locked for some reason so that git cannot push them. The most critical part of this fix is that there are three more methods need to be implemented by the backends. For details, see below.

### Implementation

First, there are three more abstract methods for ```SparkleRepoBase``` added. These are:

*     ```AddExclusionRule```: Add a new file which to be excluded by the backend
*     ```RemoveExclusionRule```: Remove the rule
*     ```ExclusionRuleExists```: Whether a rule for a file exists or not

These methods are used in ```OnFileActivity``` where are the following checks made:
1.  Check if the issued file exists and test for readability
2.  If not readable, add a new exclusion rule (if not already exists)
3.  If readable and a exclusion rule exists anyway, remove it (since the file is readable again)

---

The implementation of those methods for the git backend is done as follows:
Exclusion rules are written into .git/info/exclude as the initial rules. To determine which are the basic rules and the temporary ones, a block named "#Temporary Exclusions" is appended at the end, it not exists. This is needed for possible filename conflicts (we never want the basic exclusion rules to be modified).

##### AddExclusionRule
*     Read the whole list of names from the exclusion filename
*     Look for the "#Temporary Exclusions" block
*     If found, add the rule after
*     If not, add the block and the rule afterwards
*     Write the whole list back to the file

##### RemoveExclusionRule
*     Read the whole list of names from the exclusion filename
*     Look for the "#Temporary Exclusions" block
*     If found, look for the matching rule
*     If found, remove it from the list
*     Write the whole list back to the file

##### ExclusionRuleExists
*    Read the whole list of names from the exclusion filename
*    Look for the "#Temporary Exclusions" block
*    If found, look for the matching rule
*    If found, return true; If not, return false

---

There is also a new method in SparkleHelpers named ```DiffPaths``` which basically returns the relative path of a absolute repository filename.

Example: ```DiffPaths("/home/thomas/SparkleShare/myRepo/exampleDir/exampleFile", "/home/thomas/SparkleShare/myRepo");``` returns ```exampleDir/exampleFile```.

### Example scenarios:

```bash
~# touch file
~# chmod 000 file
~# mv file testRepo/  # A non-readable file gets moved into the repository, an exception rule is created
...
~# chmod 755 testRepo/file  # The file gets readable again, exception rule gets removed and file committed
```

```bash
~# touch file
~# chmod 000 file
~# mv file testRepo/  # A non-readable file gets moved into the repository, an exception rule is created
...
~# mkdir testRepo/newDir
~# mv testRepo/file testRepo/newDir # Exclusion rule for file gets removed since it has been deleted, but a new rule is added afterwards since a new unreadable file exists in a new path: newDir/file
```