AddFile appends a file part; the reader is fully drained into the buffer.
fieldName and filename must NOT contain `"`, `\`, CR, or LF — values are
inserted directly into the Content-Disposition header.
Build closes the multipart writer and returns the final body reader along
with the Content-Type (containing the negotiated boundary). The returned
io.Reader is single-use, as bytes.Buffer.Read advances internal state.