Add key generators for common key types and add checks ensuring tempt keys are replaced on SaveChanges

See Issue #1271. This change adds the infrastructure for any key property to have a value generator and adds an exception for when a temporary key value is still set when the state of the object is changed to Unchanged, Modified, or Deleted. This will happen if SaveChanges is given temp values and doesn't generate real values.

This change does not include a convention to make any key property have GenerateValueOnAdd, although the convention that detects keys now sets it for any key detected.
Add higher-level AttachGraph methods

Currently two methods, with async overloads:
- AttachGraph: Adds each entity if its key value is not set, otherwise attaches the entity as Unchanged.
- UpdateGraph: Adds each entity if its key value is not set, otherwise attaches the entity as Modified.

We can discuss if both behaviors are needed, and if so whether it should be a single method with a flag.

These methods make use of an implementation of IEntityAttacher and there is a factory to get the IEntityAttacher to use for attach/update. This means that the defaults can be changed by registering a different factory in DI.

The default key checking is exposed as a IsKeySet property on EntityEntry, so it is easy to use this functionaliy either in the AttachGraph delegate or in implementations of IEntityAttacher.
Commands: Remove-Migration
Added setter to PropertyEntry.CurrentValue
Fixup - added unit test for null case based on PR comments