Heater buzzing in AC triac circuit
One method you might consider is to only trigger the triac at the beginning of half-cycles and then only trigger a percentage of half-cycles based on the desired heat output.  If, for example, you wanted a 50% heat output, you would trigger the triac for 50 out of 100 half-cycles.  For 25% output, you would trigger for 25 out of 100 half-cycles.  You will need to take care not to make your trigger pulse too short or the triac may not turn on.

Similarly, you could change your opto-triac (MOC3023M) to a zero-crossing type (possibly MOC3043M) and then either use the above mentioned method, or simply time the on-time of the trigger for the desired percentage of on time, remembering that the coarseness of the control will be in increments of half-cycle times. By using a zero-crossing type opto-triac you no longer need your external zero-crossing detector.

For more on what I am describing (zero-crossing-mode) see: http://www.oztekcorp.com/blog/bid/45104/Controlling-Power-with-SCR-Phase-Angle-vs-Zero-Crossing-Mode

If you decide to use this method, you should probably get rid of the inductor as it is not needed and may cause problems with triac turn-off unless you add a snubber circuit. For more on this see:
http://www.onsemi.com/pub_link/Collateral/HBD855-D.PDF

Refer to page 38 "WHY AND HOW TO SNUB THYRISTORS" and page 114 "TRIACs AND INDUCTIVE LOADS".