Conflict exceptions: simplifying concurrent language semantics with precise hardware exceptions for data-races