Make BaseContext into an Abstract Base Class

It's not meant to be instantiated on its own, and making it an ABC (with `abstractmethod`s) highlights what the subclasses implement.

If we wanted to make `BaseContext` more purely an interface, we could pull out an `ArrayCreationMixin` and an `IOMixin`.  Just an idea :)
Even though these are implemented in both subclasses, I wouldn't expect them here.  Making them abstract and putting them in the base says that they're effectively public, doesn't it?

I've been gradually working to get rid of all external uses of `_push` and `_pull`, and I'd like to keep `_execute` internal to `Context` classes only.