Book updates and duplicate Alias handling.

Changes:
 * Model change so xml book id is no longer the same as a database book ID. Instead, books are identified by aliases.
 * Enabled book updates
 * logic to test whether passed in data is valid, and how to update records or discard it.
 * test cases for all the data changes

Tests:
 * test cases for book and alias updates
 * test cases for invalid data being handled correctly
 * test cases for various helper methods
 * test case coverage for all data conflict examples seen

Notes on design:
I wanted to make ISBN's the core identifier here, since it relates much more closely to the real world.
Since the data made it clear that ISBN was not enough to uniquely identify a record, I chose to use the
collection of aliases for a given book as a unique identifier, and use that data to determine how to handle
ambiguities. As part of this, I migrated the XML book ID to become just another alias data point.

This could be improved by discussing with the source system maintainers, checking against actual data in a 3rd party
system to see what the 'right' outcome of the updates would be based on ISBN, and discussing with other experts, all of which
might change how the decision to update or discard conflicting identifiers is made.
Minor refactor for clarity