Abstraction and performance, together at last: auto-tuning message-passing concurrency on the Java virtual machine