[catmem] Remove direct calls to memory runtime from Demikernel layer
Context
Currently the catmem implementation in the Demikernel libOS layer makes direct calls to the memory runtime, which means that those calls must be public outside of the catmem module. We should re-organize catmem to contain the memory runtime within the catmem libOS and not let external modules have access.
Proposed Solution
Instead of having the catmem module directly implement the memory runtime trait, I will create a memory runtime instance inside catmem and then implement separate functions in catmem for the Demikernel module to call, which will direct the calls to the internal memory runtime instance.
We should consider the layering of runtimes (whether they are instances inside the libOS or directly implement the runtime trait) because currently there is no uniform architecture across the libOSes. For example, some libOSes have runtimes that implement the runtime and memory runtime trait, some have two separate instances of the memory runtime and runtime, and we should make that consistent across libOSes.
We might want to move this to unstable.