Remove Record.walk

Undocumented, difficult to use, replaced by VisitorPattern.
Refactor Visitor class into VisitorPattern and Visitor

The problem with the Visitor is that it didn't work on visiting input
and returning types.  Completely change the API, splitting it into an
instance which is specific to the visiting (the Visitor) and the class
methods which define what will happen along the way (the
VisitorPattern).
Bump version & amend docs for release
Merge branch 'maint'

Conflicts:
	CHANGELOG.rst
	setup.py
Add test cases for type unions

Verify that the simplest of type union cases: property or none: are handled
by the default visitor.  Explore how type unions affect type visiting, and
add a warning.
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