Declare context and view classes on DataQuery

Instances from abstract classes do not behave like non-abstract classes.
For example, accessing `instance.pk` will raise an exception because the
implicit primary key field is not bounded to abstract models.

This solutions simply provides the ability to specific which context and
view class to use on a concrete query class.

In addition, the temporary context and view instances use the inverse pk
of the query. The inverse is used to prevent colliding with saved context
and view instances. A pk is necessary for proper cache key formation.

Signed-off-by: Byron Ruth <b@devel.io>
Consider elaborating this comment to explain why the inverse pk is used. The explanation in the PR description is perfect but I think this might be lacking a bit if we come back and look at this later and wonder why it's being negated. Other than that, PR looks good.