Implement irecv

Thanks for implementing MPI.jl! I find it quite useful.

In fact, I've made a series of changes while playing with it. I would like to merge my changes back into your version, if possible. I'll describe my changes below.

The major differences are:
- New function irecv that can receive arbitrary objects without blocking
- Introduce a Status type instead of using arrays
- Add a few more MPI functions (Abort, Initialized, Finalized, Get_count, Iprobe)
- Remove finalizers to de-register operators, requests etc., as these MPI functions should not actually be called in these cases
- Remove error-checking code since MPI aborts on errors by default, and the MPI functions that change this behaviour are not yet available

There are also other differences that accumulated:
- The C++ API of MPI is not supported any more. I'm therefore following the C API. The major differences are the names of the functions (Initialized vs. Is_Initialized, Comm_rank vs. Rank, etc.). Since Julia's object model is different from Python's or C++'s, this seemed more appropriate.
- I'm still following the mpi4py convention that capitalized functions are for pure MPI types, whereas lower case function names handle native Julia types
- I've removed some automatically generated code and replaced it by straight Julia code; this is easier to understand, and maybe even shorter
- I've replaced some ccalls by calling other wrapper functions instead
- Of course I've updated the test cases

Please let me know what you think; I sincerely hope that we can arrive at a version that you can pull back into your repository after some discussion.