Avoid emitting {'values':[...]} on JsonRecordList classes

JsonRecordList classes have an extra extraneous property,
unknown_json_keys, which somewhat ironically is impossible to get anything
into by default, and is not even visited without setting ``extraneous``.
However this default reducer was making the mapped result more complex than
it would typically need to be.  Instead, decide based on whether any of
those properties are filtered or not whether to use the complex form.
VisitorPattern deserves a README entry at least :)
Release engineering for 0.5.0

Let's try and put the README into the long description :)
Always forgetting the Changelog.
Fix comparing collections with filters

When comparing two collections with a compare_filter, the 'id_args' method
would use an empty field selector to subscript the compare_filter.  This
should be an identity operation but isn't currently, so work around it by
only subscripting by that filter if it is non-zero length.
Give MultiFieldSelector subscript operation an identity value

This seems the most correct thing to do in this situation, and makes some
usages work naturally.  Extend this to the 'in' operator, and while we're
there, skip using collections.Sequence in that function, because it matches
strings.
Release engineering for 0.5.1 release
Add support for unbound methods in compare_as=

With default=, the argument was allowed to be an unbound method and the
code detected this.  However, equivalent support was not there for
compare_as.  Unfortunately, there doesn't seem to be an easy way to tell
the difference between a lambda taking a single argument and an unbound
method call.  So, move to differentiating between method and function by
the name of the first invocant as is python convention.  Add a warning for
old code (including one test) which does not match this convention so as
not to break backwards compatibility.  Access to the object, so that the
method call can be bound when needed, required the introduction of a new
sub-class API method, normalize_object_slot.
Release 0.5.2
Squash the new warning in the test suite

Solves:

    test_property_types (test_types.TestTypeLibrary) .../tests/test_types.py:47: UserWarning: 'default' first argument should be called 'self'
      fullname = UnicodeProperty(default=lambda x: x.name, lazy=True)
    ok
Replace a duplicated test with a more useful one
Fix Property metaclass magic for multiple-trait property types

Duck-typing property types implies *all* of the traits in the property
class, not just the one defined in that class.  This was preventing its
use for types like ListProperty, which has two traits: ``coll`` and
``list``.  Fix it by storing the full 'traits' tuple in DUCKWARGS and
adding that to the combined list of traits for the property being
created.
Deal with some empty MultiFieldSelectors corner cases

Make it logically false when empty, too.
Allow diff on completely filtered collections to pass

This would previously throw:

    ======================================================================
    FAIL: test_filtered_collection_compare (test_mfs_diff.TestDiffWithMultiFieldSelector)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/home/samv/projects/normalize/tests/test_mfs_diff.py", line 344, in test_filtered_collection_compare
        {},
      File "/home/samv/projects/normalize/tests/test_mfs_diff.py", line 108, in assertDifferences
        differences = set(str(x) for x in iterator)
      File "/home/samv/projects/normalize/tests/test_mfs_diff.py", line 108, in <genexpr>
        differences = set(str(x) for x in iterator)
      File "/home/samv/projects/normalize/normalize/diff.py", line 524, in compare_collection_iter
        id_args = options.id_args(coll_type.itemtype, fs_a)
      File "/home/samv/projects/normalize/normalize/diff.py", line 314, in id_args
        options['selector'] = self.compare_filter[any]
      File "/home/samv/projects/normalize/normalize/selector.py", line 514, in __getitem__
        assert len(self.heads) == 1, "can't compare filtered collection"
    AssertionError: can't compare filtered collection

This strange exception happens to be right, but actually the code should
simply skip comparing anything in this case anyway.

Closes #45
Fine-grained, fuzzy matching in diff

When comparing structures which have no primary keys, the code used to
require an exact match on all fields to match them up.  In practice, this
resulted in only 'removed'/'added' diffs ever being generated for one
typical case: comparing data structures which have had surrogate IDs
stripped.  Add a new function 'fuzzy match' which tries to match up 'added'
and 'removed' items from collections, so that the diff mechanism can
descend further and return more fine-grained differences.
0.5.3 maintenance release
Serialize Python sets to JSON lists.
Support frozenset, too
Releng for 0.5.4
Merge branch 'maint'