Hi
Right, I'll start off, trying to answer your questions, I'm sure our forum-mates will chime in

1)
where class(TForm1) ... end; is a block.
Yes, technically => "Form1 = class(TForm1) ... end; is a block."
2)
So really the way I should be reading this file is as a type declaration, a single variable declaration (global?), and then an implementation of the type. Can the implementation section and the type declaration be in different files, similar to C/C++ header vs source file?
Yes to the first part and no to splitting declaration & implementation of a
class. One wrinkle, you can use include-files, but I'll save that for a later
round of questions...
3)
And the reason Unit1.pas has the variable declaration (var Form1: TForm1;) is specifically to create a "global" that the lpr file can use when creating the form [Application.CreateForm(TForm1, Form1);]
Yes, that's how it works.
4)
Why does TForm1 need to be specified in the Application.CreateForm call if the type of Form1 is already TForm1?
"Application.CreateForm" is a form Factory, it can create any form you'd
like, it just needs to know the type to create.
5)
One thing that I'm struggling to understand is this file has the syntax [object Form1: TForm1], whereas the pas file has the syntax (type Form1=class(TForm1)]
Well, look at the extensions... the *.pas file is written in ...Tadaa Pascal
and the *.lfm file is written in (L)azarus (F)orm (M)etadata, an object-
describing meta-language, that describes object -properties & -relations
on the form, used in loading/streaming, the syntax is kinda like xml.
6)
does instance in this case mean derived class?
When you do: "TForm1 = class(TForm)", you create a new Descendant
class of TForm that inherits all of TForm's properties, methods and abilities
to load from file. Then you add your own props and methods to that new
type. An instance is:
var
Form1: TForm1; // <-- Form1 is a concrete "Instance" of TForm1
7)
Im guessing but for FIntProp the property keyword is implied? So the only time you really need to explicitly specify something as a property is if you're going to use additional property specifiers such as read/write?
Well, it's about visibility, outside of "Unit1.pas" you can't see or touch
"FIntProp", it's [private] to the class and the unit, in which it's declared,
hence you need to surface it as a property in the [public] section, for the
outside world to use it. And yes, this way you can use getter/setter
-methods for the property, which in turn can have sideeffects, e.g.:
Setting TList.Sorted to true, will trigger the TList.sort method.
And lastly, the index property specifier. Is this just a built-in way of building custom "array" types? I'm trying to understand the use case for this and that's all I can really think of.
Yes this is <also> what they are used for, but you can have a look at
"TStringList.Names[]" and "TStringList.Values[]", they're nifty ways of using
indexed properties

Pheeewww, HTH, have fun

Regards Benny