Introduce OperationNotAllowed exception
Introduce reference tracking in Cache

Any links to a record will be stored on that record's `refs` property, keyed by the full path of the link.

These references are automatically tracked in the Cache as records and links are added and removed.
Ensure that link values are strings before adding / removing refs
Only allow "add", "remove" and "replace" operations in `transform()`
Expand comments in Cache
Privatize `_xxxxRef` methods; Introduce `_transformRef`
Cache now emits didTransform events
Add options: `trackRefs`, `trackChanges` and `trackRefChanges`
Cache automatically removes references when a record is removed
Clarify comments
Introduce `isNone`

Checks whether an object is `null` or `undefined`.
Comment out logging
Refactor `link` -> `addLink` and `unlink` -> `removeLink`
Refactor `property` -> `key` parameter in `addLink()` and `removeLink()`
MemorySource#find can find a record by object that contains an id
Implement MemorySource.findLink()
findLink now returns related records instead of raw data
Verify MemorySource#findLink - returns RecordNotFoundException for a record that doesn't exist
Rename MemorySource#_findFirst -> _filterOne

"find" methods should return promises
Comment cleanup