implemented support for asymmetric margins.

Addresses issue #1912

Changes the api in a backwards compatible way on `Axes.set_xmargin`, `Axes.set_ymargin`, and `Axes3D.set_zmargin` by adding an optional parameter.

Changes api in non-backwards compatible way in the return value of `Axes.margins()`  `(xmargin, ymargin)` -> ((left, right), (bottom, top))` and similar for `Axes3D.margins()`.