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 function could be split right here to expose `vmi_read_dtb()` that just takes the dtb as determined by vmi_read_va() instead of the `access_context_t`.  For not much work, since reducing duplicated code has already been done, this would expose some dtb based functionality without having to use an `access_context_t`.  Since exposing dtb as an addressing mode was more or less a driver for these changes, I think exposing at least this one directly in the external API makes sense.