Describir: Integrating transactions and distributed shared memory for distributed programming