Adds strategies for handling associations during extraction.

The default result of extraction is to leave embedded collections or entities.  In many situations, the desired behaviour is to perform an extraction on the related entities as well.

Two strategies are added to handle this situation (each with byValue and byReference implementations).

* ExtractId returns only the identifier of any associated entities, or an array of identifiers for a collection.
* ExtractRecursive creates new hydrators and extracts any associated entities that it finds.  Infinite recursion (in the case of loops) is prevented by one of two strategies, either by providing a "fallback" strategy (which is used after the first level of recursion) which terminates (e.g. the ExtractId above), or by automatic loop detection, which ensures that the same entity is not processed more than once.