WIP dictdiffer: diff methods and merging

* This commit is not in a working state (at least not tested), it is just
  there to support a discussion.

* Adds the option for different diff algorithms.
  Because certain difference algorithms would require the patches to be
  in order, the 'if differ:...' part had to be reworked, which led to
  patches generally having only one value instead of a list of them.

* Adds the option to expand the patch extraction. Also adds an variable
  to decide on the depth of expansion (path_limit).

* Adds merging functionality, therefor reworking the structure of the
  package.

* The current changes are not fully tested.

# To get an idea of the possible workflow:

## The default way
```
from dictdiffer import diff, merge

lca = {'foo': 'bar',
       'insert_list': [3],
       'change_list': [0,1,2,3,4,5,6]}

new1 = {'foo': 'foo-bar',
        'insert_list': [1,2,3,4,5],
        'change_list': [0,-1,-2,-3,-4,-5,6]}

new2 = {'foo': 'bar-foo',
        'insert_list': [1,2,3],
        'change_list': [0,-1,2,3,4,-5,6]}

diff1 = list(diff(lca, new1))
diff2 = list(diff(lca, new2))

success, patches = merge(diff1, diff2)
```

## The configurable way
```
from dictdiffer import diff, merge
from dictdiffer.utils import WildcardDict
from dictdiffer.extractors import get_default_extractors, SequenceExtractor
from dictdiffer.wrap.wrappers import SequenceWrapper

lca = {'foo': 'bar',
       'insert_list': [3],
       'change_list': [0,1,2,3,4,5,6]}

new1 = {'foo': 'foo-bar',
        'insert_list': [1,2,3,4,5],
        'change_list': [0,-1,-2,-3,-4,-5,6]}

new2 = {'foo': 'bar-foo',
        'insert_list': [1,2,3],
        'change_list': [0,-1,2,3,4,-5,6]}


e = get_default_extractors()
e[('insert_list',)] = SequenceExtractor
e[('change_list',)] = SequenceExtractor

diff1 = list(diff(lca, new1, expand=True, extractors=e)) 
diff2 = list(diff(lca, new2, expand=True, extractors=e)) 

# Attention, those wrappers might end up storing some internal data, using
# the same dicitonary for both wrappers like w1 = w1 = WildcardDict(...)
# is probably going to be a bad idea
wrapper1 = WildcardDict({('insert_list', '*'): SequenceWrapper(),
                         ('change_list', '*'): SequenceWrapper()})

wrapper2 = WildcardDict({('insert_list', '*'): SequenceWrapper(),
                         ('change_list', '*'): SequenceWrapper()})

def take_left(patch1, patch2, patches1, patches2, ai):
    patch1['take'] = range(len(patch1['patches']))
    patch2['take'] = []

    return True

actions = WildcardDict({('foo',): take_left,
                        ('change_list', '*'): take_left})

success, patches = merge(diff1, diff2, actions, wrapper1, wrapper2)
```
this should go to `dictdiffer/_compat.py`