Fix a pyflakes error in diff

Pyflakes protests:

  normalize/diff.py:181: import 'types' from line 7 shadowed by loop variable
  normalize/diff.py:441: import 'types' from line 7 shadowed by loop variable

Fix it.
exc: Structured Exception system

I've been a bit lazy, using Exception() all over the place instead of
specific exception classes.  Structured exceptions can be set up trivially
using this simple hack: go ahead and put it in.
selector: refactor FieldSelectorException classes

Split this error out into separate classes, and make sure that
reasonable expectations about exceptions deriving KeyError etc
hold.  For now, IndexError is not raised as it is not a separate
code path to KeyError.
exc: normalize.diff

The exception in the constructor (and therefore, the entire constructor) is
now obsolete.  Move the other fixed exception into the exc class.
exc: Exception classes for normalize.property
exc: normalize.property.meta Exception classes
exc: record and visitor Exception classes
selector: allow FieldSelector subclasses to return subclasses

In these locations, a temporary FieldSelector is created or a new
FieldSelector returned.  However if selectors are sub-classed, then the
base type will be returned.  Replace hard-coded uses of FieldSelector with
type(self), except when it is used to check if an input is of the right
type.  MultiFieldSelector gets a class property for this purpose so it too
can be subclassed.
selector: implement FieldSelector slicing

I found myself wanting to build a FieldSelector from another one, just with
the last element removed in a couple of applications.  Add support for
slicing, to make that case a simple: field_selector[:-1].  Catch up with
tests for this and other recently added features.
Fix stringification with type unions

Type unions are where the 'isa' (valuetype) field is set to a tuple.  This
mostly works, except during stringification (and presumably, comparison),
due to one loop which assumes that prop.valuetype is a type() instance.
Make the loop able to handle this case better.
record_id: throw a more helpful error if record identity is not hashable

This function could probably do better, eg by converting hashes to tuples
or something like that.  This will probably do for now.
coll: split init_values into two class methods and a property

In order to support constructor visitor patterns (eg, 'from_json'), the
visitor class should be able to "map" over input which is not already
instances of the visited types.  In order to do this, some logic which is
buried inside 'init_values' needs to be used independently.  So, split the
various functions into class methods that can be called without instances:
coll_to_tuples takes a collection and returns the itertuples() form of a
collection, and tuples_to_coll() takes a generator and returns a correct
collection, with items coerced into the correct type.  Adjust the visitor
to use these new methods, removing an ugly type switch.

Necessarily, the API for coercing from unusual collection formats changes,
see the change in test_property for how that impacts the downstream.
Merge remote-tracking branch 'origin/record-identity-fixes' into exception-classes
Merge remote-tracking branch 'origin/type-visitor' into exception-classes
exc: Exception Classes for normalize.coll, .identity
exc: normalize.property.coll
exc: tidy up tests and remove TODO note
Merge pull request #23 from hearsaycorp/fix-pyflakes-error

Fix a pyflakes error in diff
Merge pull request #20 from hearsaycorp/selector-enhancements

Selector enhancements: convenience functions
Merge pull request #21 from hearsaycorp/record-identity-fixes

Record identity fixes