Pull in / reconcile all PRs for #314

Incorporates / supersedes:
- #340
- #341
- #342
- #343 (fixes up)
- #344
- #345
- #346

Implements #314.
This doesn't really map well to the question "has property". (Naming is hard.)

Is there any reason to support `field=None`?