introduce TableItem

The TableItem class holds the hydratable properties of a hydrated or
dehydratd object, along with its partition and row keys. We'll build up
its functionality in stages, and then work it into TableStorageProvider,
ITableContext, and its implementations.

We start with support for constructing a TableItem from an object,
capturing its hydratable properties via reflection. A flag controls
behavior in the case where hydratable properties have names reserved by
Table Storage.
handle PK and RK attributes in TableItem creation
support creating TableItem without providing pk/rk
add TableItem support for dynamic objects

If an object implements IDynamicMetaObjectProvider, we use the
ImpromptuInterface library to extract dynamic properties.

In the case where throwOnReservedPropertyName is false and no partition
or row key were supplied to TableItem.Create, we use the values of the
PartitionKey and RowKey properties of the dynamic object, if they're
present. If partition and row keys *were* supplied, they must match the
values of the PartitionKey and RowKey properties, or we throw an
ArgumentException.
refactor TableStorageProvider to use TableItem

We start by refactoring the AddNewItem, Upsert, and Update methods on
ITableContext to take a TableItem. The rest of the refactoring follows
from there.