Introduce generic memory access functions

This is version # 2 of introducing generic memory access functions via an extendable structure, access_context_t. Currently LibVMI supports read/write accesses via 3 distinct mechanism: physical addresses, virtual addresses via PID and kernel virtual addresses via symbols. As there is need of adding a new set of functions where the DTB can be directly supplied for virtual address translation, this PR consolidates the code-base to support this feature with the minimal amount of code-duplication.
This may be a fundamental difference of a opinion in coding style, but when working with a primarily C code base, header bloat that an IDE/cscope/etc. can deal with is preferable to code bloat, which is what I see happening now that a struct like `access_context_t` now has to be managed to use new library functionality.  Put another way, I believe a wrapper function or macro to wrap this thing is going to end up in someone's C code, so it may as well be libvmi's.

I'll be happy to submit this as a separate PR for review once this one is merged so we can get on with this one.