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.
Certainly, this could be added with little work. However, the point of this PR was to avoid needlessly bloating the header with extra functions. If there is a specific need for having vmi_read_*_dtb() functions it's not much work now to add, but also not particularly useful/needed.