MemoryMapper interface provides 3 functions:
+ reserve() reserves address space in executor process and working
memory in the controller process
+ finalize() ensures working memory is transferred to executor process
with appropriate memory protections
+ release() deallocates memory on both side
SharedMemoryMapper implementation uses POSIX shared memory APIs to map
shared memory pages in both processes at reserve(). finalize()
only sets the memory protections and release() unmaps the memory.
Executor side is implemented with ExecutorSharedMemoryManager.
I'd leave out the implicit cast here -- only people writing new mappers should need to worry about this, and it's fine (and safer) to make them spell out .RemoteAddr explicitly.