Making reliable distributed systems in the presence of software errors (erlang.org)