Mark Teixeira to retire at end of season