David Petraeus makes public apology for affair