Draft ctypes blog post.

A framing paragraph here to motivate it for Mirage could go along these lines:

```
One of the most frequent questions about MirageOS from developers is "do I really need to write all my code in OCaml"?   We of course have very good reasons to build the core system in pure OCaml: the module system to permit reusing algorithmic abstractions at scale, and the static type checking for enforcing lightweight invariants across interfaces.  It's ultimately necessary to support interfacing with existing code of course, and this blog post will describe how we're enabling this without sacrificing the security benefits afforded by unikernels.

A MirageOS application works by abstracting the *logic* of the application from the details of *platform* that it is compiled for.  The `mirage` CLI tool parses a configuration file that represents the desired hardware target, which can be a Unix binary or a specialized Xen guest OS.  Our FFI design elaborates on these design principles by separating the *description* of the C foreign functions from how we *link* to that code.  For instance, a Unix unikernel could use the normal `ld.so` to connect to a shared library, but in Xen we would need to interface to that C library through some other mechanism (for instance, a separate VM could be spawned to run the untrusted OpenSSL code).  If you're curious about how this works, this blog post is for you!
```