Throwing exceptions was not an elegant solution here. Returning an
invalid date and having errorCode and errorMessage methods to provide
information about the last conversion seems to be a better solution.
In the process, I also cleaned up the interface a bit and hide
implementation details behind a d-pointer.