Add args() accessor back to fmt::format_context
Fix #4307 

- Add `args() const` accessor back to `fmt::format_context`
- Add test that would fail to compile if you can't create a `fmt::format_context` from another `fmt::format_context` using `args() const` and `locale() const`

{"label": "fmtlib:master", "ref": "master", "sha": "01914f0389ef6ff151c289670f6910e059d5063f"}
I have a use case where my custom formatter needs to format to a buffer and then remove either the front or the back of the buffer.

Example on 11.0.0 where this works: https://godbolt.org/z/96KeTG9bG

In order to do this, I create a new `format_context` using the original context's `args()` and `locale()` in the `format` function, but with a temporary append buffer. I then can output just a chunk of the buffer.

With 11.1.0 there was some code cleanup in 1416edabbb0f9b91053555d80015e6857f6dc433 that removed the accessor for `args_` which breaks my use case. In order for my code to work I either need:
- An accessor to `args_` and `locale_` (`locale()` is still available)
- A method to replace `out_`
- A constructor to make a new context from a `const context&` and a new `appender`

Sample found on godbolt:
```c++
#include <fmt/core.h>
#include <string_view>

template<class T>
class truncator
{
    const T& t;
    int c;
  public:
    constexpr truncator(const T& data_, const int count_) noexcept
        : t{data_}, c{count_}
    {}

    constexpr const T& data() const noexcept { return t; }
    constexpr int count() const noexcept { return c; }
};

template<class T>
constexpr truncator<T> trunc(const T& data, int count) noexcept
{
    return {data, count};
}

namespace fmt
{
template<typename T, typename Char>
struct formatter<truncator<T>, Char> : public formatter<T, Char>
{
  public:
    template<typename FormatContext>
    auto format(const truncator<T>& v, FormatContext& ctx) const
    {
        basic_memory_buffer<Char> buffer;
        format_context ctx2(appender{buffer}, ctx.args(), ctx.locale());
        formatter<T, Char>::format(v.data(), ctx2);
		auto beg = buffer.begin();
		auto end = buffer.end();
        const auto size = std::distance(beg, end);
        const auto abs_count = v.count() < 0 ? -v.count() : v.count();
        if(v.count() != 0 && size > abs_count) {
            const auto size_remove = size - abs_count;
			if(v.count() > 0) {
				beg = std::next(beg, size_remove);
			} else {
				end = std::prev(end, size_remove);
			}
        }
        ctx.advance_to(std::copy(beg, end, ctx.out()));
		return ctx.out();
    }
};
}

int main() {
  fmt::print(">{0}<\n", trunc(1234, -2));
  fmt::print(">{0}<\n", trunc(1234, 2));
}
```

Can't access context args() directly in 11.1.0
diff --git a/include/fmt/base.h b/include/fmt/base.h
index 8c0411bf42aa..010812c77608 100644
--- a/include/fmt/base.h
+++ b/include/fmt/base.h
@@ -2656,6 +2656,7 @@ class context {
   FMT_CONSTEXPR auto arg_id(string_view name) const -> int {
     return args_.get_id(name);
   }
+  auto args() const -> const format_args& { return args_; }
 
   // Returns an iterator to the beginning of the output range.
   FMT_CONSTEXPR auto out() const -> iterator { return out_; }

diff --git a/test/base-test.cc b/test/base-test.cc
index 52089feadbaf..f8af275d5320 100644
--- a/test/base-test.cc
+++ b/test/base-test.cc
@@ -875,3 +875,12 @@ TEST(base_test, no_repeated_format_string_conversions) {
   fmt::format_to(buf, nondeterministic_format_string());
 #endif
 }
+
+TEST(base_test, format_context_accessors) {
+  class copier {
+    static fmt::format_context copy(fmt::appender app,
+                                    const fmt::format_context& ctx) {
+      return fmt::format_context(std::move(app), ctx.args(), ctx.locale());
+    }
+  };
+}

{"compile-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ostream-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ranges-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "std-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "scan-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "no-builtin-types-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "color-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "chrono-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "format-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "gtest-extra-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "args-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "compile-fp-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "unicode-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "assert-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "posix-mock-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "base-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "printf-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "enforce-checks-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "format-impl-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "os-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "xchar-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}}
{"compile-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ostream-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ranges-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "std-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "scan-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "no-builtin-types-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "color-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "chrono-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "format-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "gtest-extra-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "args-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "compile-fp-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "unicode-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "assert-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "posix-mock-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "base-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "printf-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "enforce-checks-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "format-impl-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "os-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "xchar-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}}
{"passed_count": 21, "failed_count": 0, "skipped_count": 0, "passed_tests": ["compile-test", "no-builtin-types-test", "chrono-test", "gtest-extra-test", "compile-fp-test", "unicode-test", "assert-test", "base-test", "enforce-checks-test", "format-impl-test", "os-test", "xchar-test", "ostream-test", "ranges-test", "std-test", "scan-test", "color-test", "format-test", "args-test", "posix-mock-test", "printf-test"], "failed_tests": [], "skipped_tests": []}
{"passed_count": 0, "failed_count": 0, "skipped_count": 0, "passed_tests": [], "failed_tests": [], "skipped_tests": []}
{"passed_count": 21, "failed_count": 0, "skipped_count": 0, "passed_tests": ["compile-test", "no-builtin-types-test", "chrono-test", "gtest-extra-test", "compile-fp-test", "unicode-test", "assert-test", "base-test", "enforce-checks-test", "format-impl-test", "os-test", "xchar-test", "ostream-test", "ranges-test", "std-test", "scan-test", "color-test", "format-test", "args-test", "posix-mock-test", "printf-test"], "failed_tests": [], "skipped_tests": []}