> copy it into my paste buffer
Selecting text never copies anything. Selections are just metadata that points back to the X client app that "owns" the selection and presumably also has the selected data. Selecting text simply sets the owner of the PRIMARY selection to the current X client, and "pasting" with middle click is asks the current owner of the PRIMARY selection to copy the selected data into the window targeted by the click.
From ICCCM[1]:
>> Selections communicate between an owner and a requestor. The owner has the data representing the value of its selection, and the requestor receives it. A requestor wishing to obtain the value of a selection provides the following:
The name of the selection
The name of a property
A window
The atom representing the data type required
Optionally, some parameters for the request
>> If the selection is currently owned, the owner receives an event and is expected to do the following:
Convert the contents of the selection to the requested data type
Place this data in the named property on the named window
Send the requestor an event to let it know the property is available
> If I want to keep the contents of my paste buffer, I have to force myself to remember not to highlight anything,
You're having this problem because you're using the PRIMARY selection when you should be using the CLIPBOARD selection which is more durable and intended[2] for data transfer and copy/paste-like semantics.
The Copy/Paste actions traditionally found in the "Edit" menu usually interact with the CLIPBOARD selection. This should be completely orthogonal to the middle-click feature and other interactions with the PRIMARY selection. You should be able to mix usage of both selections. Try this:
select text "foo"
use Copy from the Edit menu # CLIPBOARD now points to "foo"
select different text "bar" # PRIMARY now points to "bar"
move to an editable window
use Paste from the Edit menu # pastes "foo"
middle click the same window # pastes "bar"
Unfortunately, confusion about the X server using
selections instead of a global buffer is not well explained.
[1] https://www.x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM...
[2] https://www.x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM...