Implementing reliable applications using durable functions