code: public final Try<T, A> ensuring(CheckedRunnable<T> runnable) {
          return match(t -> peek2(t::addSuppressed, __ -> {}, trying(runnable))
                               .biMapL(constantly(t))
                               .flatMap(constantly(failure(t))),
                       a -> trying(runnable).fmap(constantly(a)));
      }
docs: Run the provided runnable regardless of whether this is a success or a failure (the {@link Try} analog to
  <code>finally</code>.
  <p>
  If the runnable runs successfully, the result is preserved as is. If the runnable itself throws, and the result
  was a success, the result becomes a failure over the newly-thrown {@link Throwable}. If the result was a failure
  over some {@link Throwable} <code>t1</code>, and the runnable throws a new {@link Throwable} <code>t2</code>, the
  result is a failure over <code>t1</code> with <code>t2</code> added to <code>t1</code> as a suppressed exception.
  
  @param runnable the runnable block of code to execute
  @return the same {@link Try} instance if runnable completes successfully; otherwise, a {@link Try} conforming to
  rules above