Async ErrorLog implementation

ELMAH supports asynchronous error log implementations. Since `Elmah.Io.ErrorLog` makes remote calls and therefore mostly I/O bound, it makes sense to make it scalable by implementing the asynchronous `Begin/End` virtual members instead. The synchronous methods now delegate to the asynchronous ones. This makes the implementation more scalable by avoiding blocking threads.