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.
These look like good candidates for a `Theory`.