Add DicomFile.TryOpen method as an exception-free alternative to DicomFile.Open

Sometimes we need to scan directory structures that contain a huge amount of both DICOM and non-DICOM files. For each non-DICOM file the DicomFile.Open method bails out with an exception, which leads to an observable slowdown in the scanning process.

A switch to error handling based on return codes will noticeably improve performance if there are many non-DICOM files to be opened by the DicomFile class.

Any previously existing methods like DicomFile.Open still have the same signature and the same observable behavior and the ReaderResult class provides implicit conversion operators to and from DicomReaderResult. So there should not be much impact on calling code.